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