Подтвердить что ты не робот

Array_flip в javascript?

Есть ли какой-либо ярлык для выполнения эквивалента PHP array_flip в javascript или это нужно делать с помощью циклического перебора?

Он должен использоваться для десятков массивов, поэтому даже небольшие ускорения, вероятно, будут складываться.

4b9b3361

Ответ 1

Не думайте, что там встроено. Пример реализации здесь, хотя :).

function array_flip( trans )
{
    var key, tmp_ar = {};

    for ( key in trans )
    {
        if ( trans.hasOwnProperty( key ) )
        {
            tmp_ar[trans[key]] = key;
        }
    }

    return tmp_ar;
}

Ответ 2

Функциональная форма с использованием чистого 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'}

Ответ 3

Использование underscore _.invert

_.invert([1, 2]) 
//{1: '0', 2: '1'}

_.invert({a: 'b', c: 'd'}) 
//{b: 'a', d: 'c'}

Ответ 4

с jQuery:

var array_flipped={};
$.each(array_to_flip, function(i, el) {
  array_flipped[el]=i;
});

Ответ 5

Я думаю, вы говорите об объектах, а не массивах

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;

}

Ответ 6

Текущий верхний ответ не работал так, как ожидалось, потому что значения клавиш смещены +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
}