繁体   English   中英

在javascript中使用reduce()按多个键对数组的值进行分组

[英]Grouping values of an array by multiple keys using reduce() in javascript

我有以下数组

var array = [
   {id:"1",subject:"CE1",mark:"20"},{id:"1",subject:"CE2",mark:"30"},
   {id:"2",subject:"CE1",mark:"40"},{id:"3",subject:"CE1",mark:"20"},
   {id:"3",subject:"CE2",mark:"20"},{id:"1",subject:"CE1",mark:"40"},
   {id:"1",subject:"CE2",mark:"30"},{id:"2",subject:"CE1",mark:"20"},
   {id:"3",subject:"CE1",mark:"10"},{id:"3",subject:"CE2",mark:"10"}
]

我想要以下数组

var resultArray = [
    {id:"1",subject:"CE1",mark:"60"},
    {id:"1",subject:"CE2",mark:"60"},
    {id:"2",subject:"CE1",mark:"40"},
    {id:"3",subject:"CE1",mark:"30"},
    {id:"3",subject:"CE2",mark:"30"}
]

我有以下代码仅按 id 对数组进行分组。

var totalArray = Object.values(array .reduce((a, {id, subject, mark}) => { 
    let totMark= mark;
    if(a.hasOwnProperty(id)) {
        a[id].mark+= totMark;
    } else {
        a[id] = {
            id:id,
            subject:subject,
            mark:totMark,

        }
    }
    return a;
}, {}));

如何使用javascript按两个属性对数组进行分组?

您需要遵循类似的方法。 您可以创建一个新的键,它是您要与之分组的 2 个键的组合,而不是将id作为键添加到累加器中。

 var array = [ {id:"1",subject:"CE1",mark:"20"},{id:"1",subject:"CE2",mark:"30"}, {id:"2",subject:"CE1",mark:"40"},{id:"3",subject:"CE1",mark:"20"}, {id:"3",subject:"CE2",mark:"20"},{id:"1",subject:"CE1",mark:"40"}, {id:"1",subject:"CE2",mark:"30"},{id:"2",subject:"CE1",mark:"20"}, {id:"3",subject:"CE1",mark:"10"},{id:"3",subject:"CE2",mark:"10"} ] var totalArray = Object.values(array.reduce((acc, { id, subject, mark }) => { mark = +mark; // convert to number const key = id + '_' + subject; // unique combination of id and subject acc[key] = acc[key] || { id, subject, mark }; acc[key].mark += mark; return acc; }, {})); console.log(totalArray)

@adiga 的答案将始终添加第一个匹配键两次。 第一次出现键时,我们不想将其添加到自身中!

这条线

acc[key] = acc[key] || { id, subject, mark };

需要是

acc[key] = acc[key] || { id, subject, mark: 0 };

最后的片段:

 var array = [ {id:"1",subject:"CE1",mark:"20"},{id:"1",subject:"CE2",mark:"30"}, {id:"2",subject:"CE1",mark:"40"},{id:"3",subject:"CE1",mark:"20"}, {id:"3",subject:"CE2",mark:"20"},{id:"1",subject:"CE1",mark:"40"}, {id:"1",subject:"CE2",mark:"30"},{id:"2",subject:"CE1",mark:"20"}, {id:"3",subject:"CE1",mark:"10"},{id:"3",subject:"CE2",mark:"10"} ] var totalArray = Object.values(array.reduce((acc, { id, subject, mark }) => { mark = +mark; // convert to number const key = id + '_' + subject; // unique combination of id and subject acc[key] = acc[key] || { id, subject, mark: 0 }; acc[key].mark += mark; return acc; }, {})); console.log(totalArray)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM