2015-09-03 4 views
2

У меня есть массив объектов, выглядит так:Lodash/подчеркнуть: Преобразовать массив объектов одного объекта

var A = [{key:"key1",val:1},{key:"key2",val:2},...,{key:"keyn",val:n}] 

И я хочу, чтобы преобразовать A к объекту:

{ 
    key1: 1, 
    key2: 2, 
    ... 
    keyn: n 
} 

Этот usecase никогда не возникал, но я думал о том, чтобы делать mapKeys, а затем mapValues, и я чувствую, что есть более простой ответ. Благодаря!

+0

Pure ES6: 'A.reduce ((акк, я) => ({ ... акк, [i.key]: i.val }), {});' – zerkms

+0

Очень приятно. Не могли бы вы еще раз ответить на ES5? Я поддерживаю старые браузеры. – ShaharZ

+0

Вы можете взять 'babel' и использовать инструменты с 2015 года в 2015 году. – zerkms

ответ

3

Там может быть встроена таким образом, что я не могу найти, но:

var result = _.zipObject(
    _.pluck(A, 'key'), 
    _.pluck(A, 'val') 
); 
6

Вы действительно не нужно lodash для достижения этой цели. Просто сделайте это с array.reduce(). Смотрите пример кода ниже:

function transformArray(arraySrc){ 
    return arraySrc.reduce(function(prev, curr){ 
     prev[curr.key] = curr.val; 
     return prev; 
    }, {}); 
} 

transformArray([{key:"key1",val:1},{key:"key2",val:2},{key:"key3",val:3}]); 
+1

Я выбирая свой ответ, потому что мне нравится использовать собственный 'Array.prototype.reduce', но @minitech ответил, используя lodash, поэтому я принимаю его/ее – ShaharZ

+0

понял. Спасибо, что нашли время для объяснения. – kennasoft

+0

Вероятно, должен возвращать * newObject * или просто 'return arraySrc.reduce (...);'. ;-) – RobG

0

Пробыв некоторое время, ища lodash решения этой же задачи (и не найти какой-либо), я пришел с этой маленькой вспомогательной функции:

// Array<{}> => {}; ie.: [{ a: 1, }, { b: 2 }] => { a: 1, b: 2 } 
export const objectsListToMergedObject = (...objectsList) => 
    Object.assign({}, ...objectsList); 
0

Я d сделать это:

var result = _(A).keyBy('key').mapValues('val').value(); 

Очистить и просто.