Tìm kiếm trang web

javascript - Làm thế nào để lấy tổng của các khóa đối tượng mảng trong underscore.js?


Tôi có mảng sau:

var items = [
   {price1: 100, price2: 200, price3: 150},
   {price1: 10, price2: 50},
   {price1: 20, price2: 20, price3: 13},
]

Tôi cần lấy đối tượng với tổng của tất cả các khóa như sau:

var result = {price1: 130, price2: 270, price3: 163};

Tôi biết tôi có thể chỉ sử dụng vòng lặp nhưng tôi đang tìm kiếm một cách tiếp cận theo phong cách underscore :)

Câu trả lời #1

Không đẹp lắm, nhưng tôi nghĩ cách nhanh nhất là làm như thế này

_(items).reduce(function(acc, obj) {
  _(obj).each(function(value, key) { acc[key] = (acc[key] ? acc[key] : 0) + value });
  return acc;
}, {});

Hoặc, để thực sự làm quá mức (tôi nghĩ nó có thể nhanh hơn cách trên, nếu bạn sử dụng lazy.js thay vì underscore):

_(items).chain()
  .map(function(it) { return _(it).pairs() })
  .flatten(true)
  .groupBy("0") // groups by the first index of the nested arrays
  .map(function(v, k) { 
    return [k, _(v).reduce(function(acc, v) { return acc + v[1] }, 0)]     
  })
  .object()
  .value()

Câu trả lời số 2

Để tổng hợp, tôi khuyên dùng reduce:

_.reduce(items, function(acc, o) {
    for (var p in acc) acc[p] += o[p] || 0;
    return acc;
}, {price1:0, price2:0, price3:0});

Hoặc tốt hơn

_.reduce(items, function(acc, o) {
    for (var p in o)
        acc[p] = (p in acc ? acc[p] : 0) + o[p];
    return acc;
}, {});