Javascript 对象数组中的分组和求和
我试图在我的roomList数组中找到每种类型的总和。。。尝试了reduce,但它只返回最后一个值。有没有一种方法可以通过使用reduce。。。我对其他方法也持开放态度Javascript 对象数组中的分组和求和,javascript,arrays,Javascript,Arrays,我试图在我的roomList数组中找到每种类型的总和。。。尝试了reduce,但它只返回最后一个值。有没有一种方法可以通过使用reduce。。。我对其他方法也持开放态度 let roomList=[ {value:1,type:2},{value:2,type:2},{value:3,type:2},{value:4,type:3}, {value:5,type:4},{value:6,type:4},{value:7,type:6},{value:8,type
let roomList=[
{value:1,type:2},{value:2,type:2},{value:3,type:2},{value:4,type:3},
{value:5,type:4},{value:6,type:4},{value:7,type:6},{value:8,type:6},
{value:9,type:1},{value:10,type:8},{value:11,type:8},{value:12,type:8}
];
roomList.reduce((acc,obj)=>{
acc[obj.type]=obj.value;
return acc;
},{})
我希望得到这样的结果{1:9,2:6,3:4,4:11…}您只得到最后一个值,因为您覆盖了而没有添加。将reduce代码更改为:
roomList.reduce((acc,obj)=>{
acc[obj.type] = (acc[obj.type] || 0) + obj.value;
return acc;
},{})
要澄清这一点:
acc[obj.type] = (acc[obj.type] || 0) + obj.value;
我们不能简单地这样做:
acc[obj.type] += obj.value;
因为acc[obj.type]可能未初始化,因此返回未定义的值。相反,我们使用acc[obj.type]| | 0来检索该值,如果该值不正确,则使用值0。您只获取最后一个值,因为您覆盖了该值,而没有添加该值。将reduce代码更改为:
roomList.reduce((acc,obj)=>{
acc[obj.type] = (acc[obj.type] || 0) + obj.value;
return acc;
},{})
要澄清这一点:
acc[obj.type] = (acc[obj.type] || 0) + obj.value;
我们不能简单地这样做:
acc[obj.type] += obj.value;
因为acc[obj.type]可能未初始化,因此返回未定义的值。相反,我们使用acc[obj.type]| | 0来检索值,如果值不正确,则使用值0。您可以使用map来累积值 让roomList=[{value:1,type:2},{value:2,type:2},{value:3,type:2},{value:4,type:3},{value:5,type:4},{value:6,type:4},{value:7,type:6},{value:8,type:6},{value:9,type:1},{value:10,type:8},{value:11,type:8},{value:12,type:8}]; g={} roomList.mapo=>{ !g[o.type]?g[o.type]=o.value:g[o.type]=g[o.type]+o.value }
logg您可以使用map来累积值 让roomList=[{value:1,type:2},{value:2,type:2},{value:3,type:2},{value:4,type:3},{value:5,type:4},{value:6,type:4},{value:7,type:6},{value:8,type:6},{value:9,type:1},{value:10,type:8},{value:11,type:8},{value:12,type:8}]; g={} roomList.mapo=>{ !g[o.type]?g[o.type]=o.value:g[o.type]=g[o.type]+o.value } console.logg