javascript – 如何对数组中的对象进行分组

我有一个对象数组,我想基于两个键对其对象进行分组

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;}

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...