2015-08-20 4 views
4

Я думаю, что это удивительно общий и простой вопрос, но я не могу показаться, чтобы найти то, что Im ищетJavascript Sum массив объекта значения

Если бы я был

var array = [{"a":4,"b":5, "d":6}, {"a":4, "c":5}, {"c":4}] 

как я просуммировать объекты чтобы получить

{"a":8,"b":5,"c":9, "d":6} 

с помощью подчеркивания, lodash, или что-то довольно быстро и просто один лайнер?

ответ

3

Вы могли бы объединить , merge() и add() производить:

_.spread(_.merge)([{}].concat(array, _.add)); 
// → { a: 8, b: 5, d: 6, c: 13 } 
+0

Не знаю, как это работает, но это блестящее решение, использующее lodash. – Leon

+0

Любой способ объяснить, как это работает. Я не понимаю, как 'concat' может помочь добавить значения. – Spack

5

Вы должны быть в состоянии использовать reduce для этого

var compact = array.reduce(function(prev,cur){ 
for(var key in cur){ 
    if(!cur.hasOwnProperty(key))continue; 
    if(prev.hasOwnProperty(key)){ 
    prev[key] += cur[key]; 
    }else{ 
    prev[key] = cur[key]; 
    } 
} 
return prev; 
},{}); 
+0

Спасибо за ответ Travis. Есть ли способ увидеть это с помощью подчеркивания или lodash? – Leon

+0

@Leon: Подчеркивание имеет '_.reduce', если вы не хотите использовать стандартный JavaScript. –

2

Вы можете попробовать это решение:

var arr = [{"a":4,"b":5, "d":6}, {"a":4, "c":5}, {"c":4}]; 
 
var result = {}; 
 
arr.forEach(function(obj) { 
 
    for(var prop in obj) { 
 
    if(obj.hasOwnProperty(prop)) { 
 
     result[prop] = (result[prop] || 0) + obj[prop]; 
 
    } 
 
    } 
 
}); 
 

 
$('#result').text(JSON.stringify(result,null,2));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> 
 
<div id="result"></div>

3

_.merge с обратным вызовом будет делать:

var array = [{"a": 4, "b": 5, "d": 6}, {"a": 4, "c": 5}, {"c": 4}]; 
 

 
var result = _.merge.apply(null, array.concat([function(a, b) { 
 
    if (typeof a === 'number') { 
 
    return a + b; 
 
    } 
 
}])); 
 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min.js"></script>

+0

Это мутирует первый элемент 'array', FYI. –

+0

@AdamBoduch: true. Должен быть разрешен путем инъекции пустого объекта в начале. –

Смежные вопросы