Группировка значений массива по нескольким ключам с помощью метода Reduce () в JavaScript - PullRequest
0 голосов
/ 10 июля 2019

У меня есть следующий массив

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"}
]

У меня есть следующий код, который группирует массив только по идентификатору.

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?

1 Ответ

1 голос
/ 10 июля 2019

Вы должны следовать аналогичному подходу. Вместо добавления id в качестве ключа к аккумулятору, вы можете создать новый ключ, который представляет собой комбинацию из 2 ключей, с которыми вы хотите сгруппировать.

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