Преобразование массива 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;
}

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

4 ответов


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

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

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

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

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


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

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), {});
}

вы можете обернуть все это в 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 будет


Лодашь есть _.fromPairs метод, который делает именно это.

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