javascript - Jak získat součet klíčů objektu pole v underscore.js?
Mám následující pole:
var items = [
{price1: 100, price2: 200, price3: 150},
{price1: 10, price2: 50},
{price1: 20, price2: 20, price3: 13},
]
Potřebuji získat objekt se součtem všech klíčů, jako je následující:
var result = {price1: 130, price2: 270, price3: 163};
Vím, že mohu použít jen smyčku, ale hledám přístup ve stylu underscore :)
Odpověď č. 1
Není to moc pěkné, ale myslím, že nejrychlejší metoda je udělat to takto
_(items).reduce(function(acc, obj) {
_(obj).each(function(value, key) { acc[key] = (acc[key] ? acc[key] : 0) + value });
return acc;
}, {});
Nebo, abychom to opravdu přehnali (myslím, že to může být rychlejší než výše uvedené, pokud použijete lazy.js místo 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()
Odpověď č. 2
Pro agregaci bych doporučil reduce:
_.reduce(items, function(acc, o) {
for (var p in acc) acc[p] += o[p] || 0;
return acc;
}, {price1:0, price2:0, price3:0});
Nebo lépe
_.reduce(items, function(acc, o) {
for (var p in o)
acc[p] = (p in acc ? acc[p] : 0) + o[p];
return acc;
}, {});
