Есть ли какой-либо ярлык для выполнения эквивалента PHP array_flip в javascript или это нужно делать с помощью циклического перебора?
Он должен использоваться для десятков массивов, поэтому даже небольшие ускорения, вероятно, будут складываться.
Есть ли какой-либо ярлык для выполнения эквивалента PHP array_flip в javascript или это нужно делать с помощью циклического перебора?
Он должен использоваться для десятков массивов, поэтому даже небольшие ускорения, вероятно, будут складываться.
Не думайте, что там встроено. Пример реализации здесь, хотя :)
.
function array_flip( trans )
{
var key, tmp_ar = {};
for ( key in trans )
{
if ( trans.hasOwnProperty( key ) )
{
tmp_ar[trans[key]] = key;
}
}
return tmp_ar;
}
Функциональная форма с использованием чистого ES5. Для устаревших браузеров используйте es5-shim.
var example = {a: 'foo', b: 'bar'};
var flipped = Object.keys(example) //get the keys as an array
.filter(example.hasOwnProperty.bind(example)) //safety check (optional)
.reduce(function(obj, key) { //build up new object
obj[example[key]] = key;
return obj;
}, {}); //{} is the starting value of obj
// flipped is {foo: 'a', bar: 'b'}
Использование underscore _.invert
_.invert([1, 2])
//{1: '0', 2: '1'}
_.invert({a: 'b', c: 'd'})
//{b: 'a', d: 'c'}
с jQuery:
var array_flipped={};
$.each(array_to_flip, function(i, el) {
array_flipped[el]=i;
});
Я думаю, вы говорите об объектах, а не массивах
function flip(o){
var newObj = {}
Object.keys(o).forEach((el,i)=>{
newObj[o[el]]=el;
});
return newObj;
}
В противном случае это может быть
function flip(o){
var newObj = {}
if (Array.isArray(o)){
o.forEach((el,i)=>{
newObj[el]=i;
});
} else if (typeof o === 'object'){
Object.keys(o).forEach((el,i)=>{
newObj[o[el]]=el;
});
}
return newObj;
}
Текущий верхний ответ не работал так, как ожидалось, потому что значения клавиш смещены +1. (и поэтому возвращаемый массив tmpArr (0) также всегда undefined. Поэтому я вычитал 1 из значения ключа и работал как ожидалось.
function array_flip2 (trans) {
var key
var tmpArr = {}
for (key in trans) {
if (!trans.hasOwnProperty(key)) {
continue
}
tmpArr[trans[parseInt(key)]-1] = (key)
}
return tmpArr
}