Преобразование массива JavaScript из 2 массивов элементов в пары значений объекта

Каков самый быстрый алгоритм для получения от чего-то вроде этого:

var array = [ [1,'a'], [2,'b'], [3,'c'] ];

примерно так:

Object { 1: "a", 2: "b", 3: "c" }

до сих пор это то, что я придумал:

function objectify(array) {
    var object = {};
    array.forEach(function(element) {
        object[element[0]] = element[1];
    });
    return object;
}

который отлично работает, но кажется неудобным. Есть ли способ лучше? Будет что-то вроде reduce() работать и будет ли это быстрее?

Ответ 1

Вы действительно можете использовать Array.prototype.reduce:

function objectify(array) {
    return array.reduce(function(p, c) {
         p[c[0]] = c[1];
         return p;
    }, {});
}

где p - результат предыдущей итерации, изначально {}, а c - текущий элемент массива.

Это вряд ли будет быстрее, чем array.forEach, но это IMHO чище. Я не верю, что есть более простая реализация, чем эта.

NB: функция, которую нужно выполнить, уже существует в библиотеке Underscore: _.object(array)

Ответ 2

Тесная версия с использованием современного синтаксиса:

let objectify = a => a.reduce( (o,[k,v]) => (o[k]=v,o), {} );

Я использую этот метод как часть синтаксического анализа строки запроса:

// Converts "?foo=bar&j=1&go" into { foo:'bar', j:'1', go:true }
function parseQueryString(qs) {
    var q = decodeURIComponent;
    return qs.replace(/^\?/,'').split('&').map(s => s.split('='))
             .reduce((o,[k,v]) => (o[q(k)] = v?q(v):true, o), {});
}

Ответ 3

Lodash имеет метод _.fromPairs, который делает именно это.

Из документации:
_.fromPairs([['a', 1], ['b', 2]]); // => { 'a': 1, 'b': 2 }

Ответ 4

Вы можете обернуть всю вещь в Array.prototype.reduce, например

function objectify(array) {
    return array.reduce(function(result, currentArray) {
        result[currentArray[0]] = currentArray[1];
        return result;
    }, {});
}

console.log(objectify([ [1, 'a'], [2, 'b'], [3, 'c'] ]));
# { '1': 'a', '2': 'b', '3': 'c' }

Мы просто накапливаем пары ключ-значение в объекте result, и, наконец, результатом reduce будет объект result, и мы возвращаем его как фактический результат.

Ответ 5

С Object.fromEntries вы можете конвертировать из Array в Object:

var array = [
  [1, 'a'],
  [2, 'b'],
  [3, 'c']
];
var object = Object.fromEntries(array);
console.log(object);