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((输出,项)=>{
让瓦尔