javascript - 按相同元素对数组对象求和

标签 javascript underscore.js

var data = [
   {id: 1, quantity: 10, category: 'A'},
   {id: 2, quantity: 20, category: 'B'},
   {id: 1, quantity: 30, category: 'A'},
   {id: 1, quantity: 30, category: 'Z'},
   {id: 2, quantity: 40, category: 'D'}
];

var totalPerType = {};
for (var i = 0, len = data.length; i < len; ++i) {
    totalPerType[data[i].id] = totalPerType[data[i].id] || 0;
    totalPerType[data[i].id] += data[i].quantity;
}
var out = _.map(totalPerType, function (id, quantity) {
    return {'id': id, 'quantity': quantity};
});
console.log(out);

我的代码目前对具有相同 ID 的对象的数量求和。它返回

[ {id:1, quantity:70}, {id:2, quantity:60} ]

如何根据 id 和类别获取对象的总和?

例如,我需要这样的输出:

[ 
     {id:1, quantity:40, category:A}, 
     {id:1, quantity:30, category:Z}, 
     {id:2, quantity:20, category:B}, 
     {id:, quantity:40, category:D} 
]

我想要纯 javascript 和下划线的答案。

最佳答案

使用普通 js。

var tmp = {}

data.forEach(function (item) {
    var tempKey = item.id + item.category;
    if (!tmp.hasOwnProperty(tempKey)) {
        tmp[tempKey] = item;
    } else {
        tmp[tempKey].quantity += item.quantity;
    }
});

var results = Object.keys(tmp).map(function(key){
    return tmp[key];
});

请注意,这将更改原始数据中的对象。如果不需要的话,在添加到 tmp 对象时需要复制 item

var data = [
   {id: 1, quantity: 10, category: 'A'},
   {id: 2, quantity: 20, category: 'B'},
   {id: 1, quantity: 30, category: 'A'},
   {id: 1, quantity: 30, category: 'Z'},
   {id: 2, quantity: 40, category: 'D'}
];

var tmp = {}

data.forEach(function (item) {
    var tempKey = item.id + item.category;
    if (!tmp.hasOwnProperty(tempKey)) {
        tmp[tempKey] = item;
    } else {
        tmp[tempKey].quantity += item.quantity
    }
});

var results = Object.keys(tmp).map(function(key){
    return tmp[key];
});

document.body.innerHTML ='<pre>' + JSON.stringify(results,null,4) +'</pre>';

关于javascript - 按相同元素对数组对象求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33282860/

相关文章:

当日为 31 且下个月没有时,javascript 日期 setMonth 失败

大数据的 Javascript 循环优化

javascript原型(prototype)方法assign VS underscore _.extend

javascript - 下划线模板错误 = 未捕获的语法错误 : Unexpected token ILLEGAL

javascript - 如何选择除第一个 div 之外的所有主体元素

javascript - 在Firebase中,是否可以在不指定子项值的情况下读取子项的数据?

javascript - 为什么在 javascript 中使用 "//-->"

javascript - 下划线模板添加额外的 <h2> 标签

javascript - 在 underscore.js/lodash.js 中,如何使用 `uniq` 删除重复的元组?

backbone.js - underscore.js 模板中的每个循环