求和数组的相同对象

时间:2015-08-31 20:34:13

标签: javascript

var data = [ {id:1, qty:100}, {id:2, qty:200}, {id:1, qty:100}, {id:2, qty:200} ];

如何将此数组求和为[ {id:1, qty:200}, {id:2, qty:400} ];

THX。

4 个答案:

答案 0 :(得分:4)

试试这个:

var sum = [];

data.forEach(function(o) {
    var existing = sum.filter(function(i) { return i.id === o.id })[0];

    if (!existing)
        sum.push(o);
    else
        existing.qty += o.qty;
});

请参阅Fiddle

答案 1 :(得分:1)

使用Ramda

var f = R.compose(
    R.values(),
    R.mapObj(R.reduce(function(a,b) {return {'id': b.id, 'qty':a.qty+b.qty}}, {qty:0})),
    R.groupBy(R.prop('id'))
);

var data = [ {id:1, qty:100}, {id:2, qty:200}, {id:1, qty:100}, {id:2, qty:200} ];

console.log(f(data));

http://jsfiddle.net/4496escu/2/

答案 2 :(得分:0)

我没有对任何数据运行此操作,但逻辑似乎正确。基本上这个代码遍历你的数组,对于每个唯一的实例,它会将值存储到一个临时数组中,并在原始数组上写入结果。

var temp = [];
temp.push(data[0])
for (x = 1; x < data.length; x++){
  for (i = 0; i < temp.length; i++){
    if (temp[i].id != data[x].id && temp[i].qty != data[x].qty ){
      temp.push[data[x]];
    }
  }
}
data = temp;

答案 3 :(得分:0)

您可以使用功能方式,使用 .reduce() .map()方法。

在我的例子中,我已经发挥了一个功能,使这个过程更加通用。

  var data = [ {id:1, qty:100}, {id:2, qty:200}, {id:1, qty:100}, {id:2, qty:200} ];

  function reducer(data, groupBy, reduceValue){
    //Reduce your data and initialize it with an empty object
    return [].concat.apply(data.reduce(function(hash, current){
      //If hash get current key, retrieve it and add sum property
      hash[current[groupBy]] = (hash[current[groupBy]] || 0) + current[reduceValue];
      //Return our current hash
      return hash;
    }, {})).map(function(elm){
      //Retrieve object keys
      return Object.keys(elm).map(function(key){
        //Build our object
        var obj = {};
        obj[groupBy] = +key;
        obj[reduceValue] = elm[key];
        return obj;
      });
    })[0];
  }

  console.log(reducer(data, 'id', 'qty'));
  //[ {id:1, qty:200}, {id:2, qty:400} ];

此函数需要3个参数

  • 将减少的数据
  • groupBy参数
  • 数据汇总对象的关键