此逻辑是将Items ID组合到数组中。如果退出ItemId,则会增加总和。有没有办法使用地图或其他东西来重构它?
function combine2(order) {
let combine = [];
message2.Items.forEach((line) => {
let id = line.ItemId;
if (combine[id]) {
combine[id].Sum += line.Sum;
} else {
combine[id] = {
Id: id,
Sum: line.Sum
}
}
});
return combine;
}
message2 = {
Items: [
{ItemId: "222", Sum: 2 },
{ItemId: "222", Sum: 2 },
{ItemId: "333", Sum: 3 }
]
}
输出
[ <222 empty items>,
{ Id: '222', Sum: 4 },
<110 empty items>,
{ Id: '333', Sum: 3 } ]
我不明白为什么它在输出中显示<222个空项目>
答案 0 :(得分:1)
您可以使用Array.reduce()
:
var message2 = {
Items: [
{ItemId: "222", Sum: 2 },
{ItemId: "222", Sum: 2 },
{ItemId: "333", Sum: 3 }
]
}
var res = message2.Items.reduce((acc, obj)=>{
var existObj = acc.find(item => item.Id === obj.ItemId);
if(existObj){
existObj.Sum += obj.Sum;
return acc;
}
acc.push({Id: obj.ItemId, Sum: obj.Sum});
return acc;
},[]);
console.log(res);
答案 1 :(得分:0)
您应该像let combine = {};
中那样,将Combine初始化为json对象,而不是数组。
答案 2 :(得分:0)
获得222个空对象作为数组的原因是因为您拥有else块
} else {
combine[id] = {
Id: id,
Sum: line.Sum
}
}
此代码的作用是将您的数组称为combine
,并向id
处的索引中添加内容,因此如果id
等于222
在第一种情况下,它将在索引222处插入一个类似{ Id: '222', Sum: 4 }
的对象,这是数组中的第223个对象。
因此,您将对象作为数组的第223个元素插入,这就是为什么要启动222个空对象的原因
答案 3 :(得分:0)
可以使用Array.reduce()
和Map()
来完成:
var message2 = {
Items: [
{ItemId: "222", Sum: 2 },
{ItemId: "222", Sum: 2 },
{ItemId: "333", Sum: 3 }
]
};
var result = message2.Items.reduce((map => (r, a) => {
map.set(a.ItemId, map.get(a.ItemId) || r[r.push({ ItemId: a.ItemId, Sum: 0 }) - 1]);
map.get(a.ItemId).Sum += a.Sum;
return r;
})(new Map), []);
console.log(result);