基于多个属性组合对象集合

时间:2017-05-31 11:20:48

标签: javascript lodash

是否有Javascipt或Lodash方法来组合这个对象集合:

[
{
  typeId: 'random1'
  catId: 'random2'
  val: '2'
},
{
  typeId: 'random1'
  catId: 'random2'
  val: '3'
},
{
  typeId: 'random1'
  catId: 'random4'
  val: '1'
}
]

进入这一个,每个对象都有唯一的typeId-catId对,并且数值要总结:

[
{
  typeId: 'random1'
  catId: 'random2'
  val: '5'
},
{
  typeId: 'random1'
  catId: 'random4'
  val: '1'
}
]

4 个答案:

答案 0 :(得分:1)

首先创建一个跟踪相似对象总val的对象,然后将它们处理成最终输出格式。像这样:

var data = [
{
  typeId: 'random1',
  catId: 'random2',
  val: '2'
},
{
  typeId: 'random1',
  catId: 'random2',
  val: '3'
},
{
  typeId: 'random1',
  catId: 'random4',
  val: '1'
}
];

var groups = data.reduce(function(acc, obj) {
  acc[obj.typeId+'_'+obj.catId] = acc[obj.typeId+'_'+obj.catId] || 0;
  acc[obj.typeId+'_'+obj.catId] += +obj.val;
  return acc;
}, {});


var result = Object.keys(groups).map(function(key) {
  return {
    typeId: key.split('_')[0],
    catId: key.split('_')[1],
    val : groups[key]
  }
});

console.log(result);

答案 1 :(得分:1)

您可以使用#!/bin/bash if [[ `which $1 &> /dev/null` ]]; then echo "Execute the script" else echo "Error! Usage: "`basename $0`" <command_name>" fi 循环和forEach()参数按thisArgtypeId属性对对象进行分组。

&#13;
&#13;
catId
&#13;
&#13;
&#13;

答案 2 :(得分:1)

您可以使用query-js(*)。尽管如此,该模块还没有维护一段时间。你会做这样的事情:

arr.groupBy(function(e){return e.typeId + e.catId;}).each(function(grp){
  let first = grp.first();
  return {
            typeId : first.typeId,
            catId : first.catId,
            val : grp.sum(function(e){return 0 + e.val;})
          };
});

首先对对象进行分组,然后对每个组进行计算

(*)请注意,我完全有偏见,你不能把我的话作为推荐而只是建议,因为我是query-js的创建者

答案 3 :(得分:0)

这个怎么样?

for (var i=0; i<array.length; i++) {
  for (var j=i+1; j<array.length; j++) {
    if (array[i].typeId == array[j].typeId && array[i].catId == array[j].catId) {
      array[i].val = parseInt(array[i].val) + parseInt(array[j].val);
      array.splice(j--, 1);
    }
  }
}