使用JavaScript中的reduce()通过多个键将数组的值分组

时间:2019-07-10 08:41:26

标签: javascript arrays reduce

我有以下数组

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 个答案:

答案 0 :(得分:1)

您需要遵循类似的方法。您可以创建一个新密钥,而不是将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)

答案 1 :(得分:1)

@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)