Javascript 对对象数组中的相似键求和

Javascript 对对象数组中的相似键求和,javascript,arrays,object,Javascript,Arrays,Object,我有一个对象数组,如下所示: [ { 'name': 'P1', 'value': 150 }, { 'name': 'P1', 'value': 150 }, { 'name': 'P2', 'value': 200 }, { 'name': 'P3', 'value': 450 } ] 我需要将具有相

我有一个对象数组,如下所示:

[
    {
        'name': 'P1',
        'value': 150
    },
    {
        'name': 'P1',
        'value': 150
    },
    {
        'name': 'P2',
        'value': 200
    },
    {
        'name': 'P3',
        'value': 450
    }
]
我需要将具有相同名称的对象的所有值相加。(可能还有其他数学运算,如calculate average。)对于上述示例,结果为:

[
    {
        'name': 'P1',
        'value': 300
    },
    {
        'name': 'P2',
        'value': 200
    },
    {
        'name': 'P3',
        'value': 450
    }
]

首先遍历数组并将“name”推送到另一个对象的属性中。如果属性存在,则将“值”添加到属性的值中,否则将属性初始化为“值”。构建此对象后,遍历属性并将它们推送到另一个数组

下面是一些代码:

var obj=[
{'name':'P1','value':150},
{'name':'P1','value':150},
{'name':'P2','value':200},
{'name':'P3','value':450}
];
var-holder={};
对象forEach(功能(d){
if(持有人拥有自己的财产(姓名)){
持有人[d.name]=持有人[d.name]+d.value;
}否则{
持有人[d.name]=d.value;
}
});
var obj2=[];
用于(支架中的var支柱){
obj2.push({name:prop,value:holder[prop]});
}

console.log(obj2)首先遍历数组并将“name”推入另一个对象的属性中。如果属性存在,则将“值”添加到属性的值中,否则将属性初始化为“值”。构建此对象后,遍历属性并将它们推送到另一个数组

下面是一些代码:

var obj=[
{'name':'P1','value':150},
{'name':'P1','value':150},
{'name':'P2','value':200},
{'name':'P3','value':450}
];
var-holder={};
对象forEach(功能(d){
if(持有人拥有自己的财产(姓名)){
持有人[d.name]=持有人[d.name]+d.value;
}否则{
持有人[d.name]=d.value;
}
});
var obj2=[];
用于(支架中的var支柱){
obj2.push({name:prop,value:holder[prop]});
}
console.log(obj2)可用于在每次迭代期间累积结果

var arr=[{'name':'P1','value':150},{'name':'P1','value':150},{'name':'P2','value':200},{'name':'P3','value':450};
var结果=arr.REDUCT(功能(acc,val){
var o=附件过滤器(功能(obj){
返回obj.name==val.name;
}).pop()| |{name:val.name,值:0};
o、 value+=val.value;
acc.push(o);
返回acc;
},[]);
控制台日志(结果)可用于在每次迭代期间累积结果

var arr=[{'name':'P1','value':150},{'name':'P1','value':150},{'name':'P2','value':200},{'name':'P3','value':450};
var结果=arr.REDUCT(功能(acc,val){
var o=附件过滤器(功能(obj){
返回obj.name==val.name;
}).pop()| |{name:val.name,值:0};
o、 value+=val.value;
acc.push(o);
返回acc;
},[]);

控制台日志(结果)出于某种原因,当我运行@Vignesh Raja的代码时,我得到了“总和”,但也得到了重复的项目。因此,我必须按照下面的描述删除重复项

原始阵列:

arr=[{name: "LINCE-01", y: 70}, 
 {name: "LINCE-01", y: 155},
 {name: "LINCE-01", y: 210},
 {name: "MIRAFLORES-03", y: 232},
 {name: "MIRAFLORES-03", y: 267}]
使用@VigneshRaja的代码:

var result = arr.reduce(function(acc, val){
    var o = acc.filter(function(obj){
        return obj.name==val.name;
    }).pop() || {name:val.name, y:0};

    o.y += val.y;
    acc.push(o);
    return acc;
},[]);

console.log(result);
第一项成果:

result: [{name: "LINCE-01", y: 435},
 {name: "LINCE-01", y: 435},
 {name: "LINCE-01", y: 435},
 {name: "MIRAFLORES-03", y: 499},
 {name: "MIRAFLORES-03", y: 499}]
删除重复项:

var finalresult = result.filter(function(itm, i, a) {
                            return i == a.indexOf(itm);
                        });
console.log(finalresult);
最后,我得到了我吹嘘的东西:

finalresult = [{name: "LINCE-01", y: 435},
 {name: "MIRAFLORES-03", y: 657}]

关于,

出于某种原因,当我运行@Vignesh Raja的代码时,我得到了“总和”,但也得到了重复的项。因此,我必须按照下面的描述删除重复项

原始阵列:

arr=[{name: "LINCE-01", y: 70}, 
 {name: "LINCE-01", y: 155},
 {name: "LINCE-01", y: 210},
 {name: "MIRAFLORES-03", y: 232},
 {name: "MIRAFLORES-03", y: 267}]
使用@VigneshRaja的代码:

var result = arr.reduce(function(acc, val){
    var o = acc.filter(function(obj){
        return obj.name==val.name;
    }).pop() || {name:val.name, y:0};

    o.y += val.y;
    acc.push(o);
    return acc;
},[]);

console.log(result);
第一项成果:

result: [{name: "LINCE-01", y: 435},
 {name: "LINCE-01", y: 435},
 {name: "LINCE-01", y: 435},
 {name: "MIRAFLORES-03", y: 499},
 {name: "MIRAFLORES-03", y: 499}]
删除重复项:

var finalresult = result.filter(function(itm, i, a) {
                            return i == a.indexOf(itm);
                        });
console.log(finalresult);
最后,我得到了我吹嘘的东西:

finalresult = [{name: "LINCE-01", y: 435},
 {name: "MIRAFLORES-03", y: 657}]
关于,

一种ES6方法,通过
name
分组: 可以使用将对象数组转换为。映射有键值对,其中每个键值都是
名称
,每个
都是该特定
名称
键值的累积和。然后,您可以使用轻松地将贴图转换回数组,其中您可以提供一个映射函数,该函数将获取贴图的键/值并将其转换为对象:

const arr=[{'name':'P1','value':150},{'name':'P1','value':150},{'name':'P2','value':200},{'name':'P3','value':450}];
const res=数组。from(arr.reduce(
(m,{name,value})=>m.set(name,(m.get(name)| | 0)+value),新映射
),([name,value])=>({name,value}));
控制台日志(res)一种ES6方法,通过
name
分组: 可以使用将对象数组转换为。映射有键值对,其中每个键值都是
名称
,每个
都是该特定
名称
键值的累积和。然后,您可以使用轻松地将贴图转换回数组,其中您可以提供一个映射函数,该函数将获取贴图的键/值并将其转换为对象:

const arr=[{'name':'P1','value':150},{'name':'P1','value':150},{'name':'P2','value':200},{'name':'P3','value':450}];
const res=数组。from(arr.reduce(
(m,{name,value})=>m.set(name,(m.get(name)| | 0)+value),新映射
),([name,value])=>({name,value}));

控制台日志(res)我想还有一个干净的解决方案


var obj=[
{'name':'P1','value':150},
{'name':'P1','value':150},
{'name':'P2','value':200},
{'name':'P3','value':450}
];
var结果=[];
Array.from(新集合(obj.map(x=>x.name)).forEach(x=>{
结果.推送(对象过滤器(y=>y.name==x).reduce((输出,项)=>{
设val=输出[x]==未定义?0:输出[x];
输出[x]=(item.value+val);
返回输出;
},{}));
})

控制台日志(结果)我想还有一个干净的解决方案


var obj=[
{'name':'P1','value':150},
{'name':'P1','value':150},
{'name':'P2','value':200},
{'name':'P3','value':450}
];
var结果=[];
Array.from(新集合(obj.map(x=>x.name)).forEach(x=>{
结果.推送(对象过滤器(y=>y.name==x).reduce((输出,项)=>{
让瓦尔