使用javascript获取数组对象中具有两个相同属性值的项的总和

使用javascript获取数组对象中具有两个相同属性值的项的总和,javascript,Javascript,我有一个对象数组: var obj = [ {name: 'a1', type: 't1', price: 10}, {name: 'a1', type: 't1', price: 10}, {name: 'a2', type: 't2', price: 10}, {name: 'a1', type: 't2', price: 10}, ]; 我需要得到这个结果: [ {name: 'a1', type: 't1', price: 20}, {name: 'a1', t

我有一个对象数组:

var obj = [
  {name: 'a1', type: 't1', price: 10},
  {name: 'a1', type: 't1', price: 10},
  {name: 'a2', type: 't2', price: 10},
  {name: 'a1', type: 't2', price: 10},
];
我需要得到这个结果:

[
  {name: 'a1', type: 't1', price: 20},
  {name: 'a1', type: 't2', price: 10},
  {name: 'a2', type: 't2', price: 10}
]

当且仅当属性
name
type
匹配时,我想对项目求和。有什么想法吗?

你可以
缩小成
地图
,然后把它变成一个数组:

var obj=[
{名称:'a1',类型:'t1',价格:10},
{名称:'a1',类型:'t1',价格:10},
{名称:'a2',类型:'t2',价格:10},
{名称:'a1',类型:'t2',价格:10},
];
const map=obj.reduce((map,{name,type,price})=>{
console.log('iter');
const key=name+'\'+类型;
返回map.set(键,(map.get(键)| | 0)+价格);
},新地图());
常量输出=[…map.entries()].map([key,val])=>{
常量[名称,类型]=键拆分(“”);
返回{名称、类型、价格:val};
});

控制台日志(输出)您可以使用
reduce
将其分组为一个对象。使用
Object.values
将对象转换为数组

var obj=[
{名称:'a1',类型:'t1',价格:10},
{名称:'a1',类型:'t1',价格:10},
{名称:'a2',类型:'t2',价格:10},
{名称:'a1',类型:'t2',价格:10},
];
var结果=对象值(对象减少((c,v)=>{
设k=v.name+'-'+v.type;
c[k]=c[k]|{…v,价格:0};
c[k]。价格+=v.价格;
返回c;
}, {}));
控制台日志(结果)您可以尝试以下操作(按名称和类型求和和和排序)

var obj=[
{名称:'a1',类型:'t1',价格:10},
{名称:'a1',类型:'t1',价格:10},
{名称:'a2',类型:'t2',价格:10},
{名称:'a1',类型:'t2',价格:10},
];
//首先创建完成价格总和的结果对象
var结果=目标减少((a,c)=>{
if(a[c.name+“”+c.type]){
a[c.name+“”+c.type].price+=c.price;
}否则{
a[c.name+“”+c.type]=c;
}
返回a;
}, {});
//获取数组中的值
结果=对象值(结果);
//按名称对数组排序,然后键入
结果.排序((a,b)=>{
如果(a.name==b.name)返回a.type.localeCompare(b.type);
返回a.name.localeCompare(b.name);
});
控制台日志(结果)您可以使用来根据您的需求构建新阵列

const obj=[{
名称:“a1”,
类型:“t1”,
价格:10,,
},
{
名称:“a1”,
类型:“t1”,
价格:10,,
},
{
名称:“a2”,
类型:“t2”,
价格:10,,
},
{
名称:“a1”,
类型:“t2”,
价格:10,,
},
].reduce((tmp,x)=>{
//查看tmp中是否已存在匹配项
const findItem=tmp.find(y=>y.name==x.name&&y.type==x.type);
//它不在里面
如果(!findItem){
tmp.push(x);
返回tmp;
}
//它在里面
findItem.price+=x.price;
返回tmp;
}, []);

控制台日志(obj)阅读你的问题,并在评论中让我们理解,可能重复@HarishSoni不介意这个问题,我只需要得到结果,想想你有什么困难?当人们不理解你的问题时,人们是如何给你结果的。很高兴为你提供帮助:)@JonasW。如果我不在
对象上展开
v
。赋值
,它实际上会更改
v
price
的值。我愿意接受建议:)或者我可以做这个
Object.assign({},v,{price:0})并且工作正常。
{…v,价格:0}
?!哦,很好。我没有想到这一点。谢谢@JonasW。