我有一个对象数组,我想基于两个键对其对象进行分组
var arr = [ {"name": "apple","id": "apple_0","c":'20'},{"name": "dog","id": "dog_1","c":'10'},{"name": "apple","c":'30'},];
而且我期待结果如此
var final = [ {"name": "apple","c":'50'},"c":'20'} ];
场景是这样的 – 我想根据名称和ID对对象进行分组.如果在最终数组中找到name和id,则将其c的总和.
我试过这个:
var final = []; for(var i = 0; i<arr.length; i++){ var obj = {}; obj = arr[i]; for(var j = 0; j<final.length; j++){ if((obj[name] !== final[j].name) && (obj[id] !== final[j].id)){ final.push(obj) }else{ //addition of key `c` in existing object in `final` array } } }
但是内部for循环不起作用,并且由于连续循环执行而挂起我的系统.
请让我知道如何解决它或任何其他逻辑,以获得最终结果.
解决方法
这是一个使用哈希表和#reduce()函数的解决方案 – 请参阅下面的演示:
var arr = [{"name": "apple","c":'10'}]; var result = arr.reduce(function(hash){ return function(p,c){ if(hash[c.id]) hash[c.id].c = +hash[c.id].c + +c.c else { hash[c.id] = hash[c.id] || c; p.push(hash[c.id]); } return p; } }(Object.create(null)),[]); console.log(result);
.as-console-wrapper{top:0;max-height:100%!important;}