Сравнение значения в масииве со значением в свойстве объекта

Пытаюсь на JS решить такую задачу: Есть два массива

const kekvCode = [ "3130", "3131", "3231" ]

const accountCode = [ "1010", "1011", "2010", "2011", "3010" ]

и массив входящих значений

const input = [
  {
    kekv: '3130',
    opSum: 600,
    accountCode: '1011'
  },
  {
    kekv: '3130',
    opSum: 700,
    accountCode: '2011'
  },
  {
    kekv: '3130',
    opSum: 500,
    accountCode: '3010'
  },
  {
    kekv: '3131',
    opSum: 400,
    accountCode: '1011'
  },
  {
    kekv: '3131',
    opSum: 300,
    accountCode: '3010'
  },
  {
    kekv: '3231',
    opSum: 200,
    accountCode: '1010'
  },
  {
    kekv: '3231',
    opSum: 100,
    accountCode: '2010'
  },
]

Нужно массив input сгрупировать по значениям массива kekvCode так, чтобы получить в каждом сгрупированном объекте массив объектов, количество которых равно количеству значений в accountCode, где ключом каждого объекта будет "kekv", а значением массив объектов в каждом из которых значение opSum будет равно 0 если в исходном массиве отсуствует accountCode соответсвующий ключу, т.е. kekv.

Например для kekv 3130 массив объектов будет следующим

3130: Array(5) [ {…}, {…}, {…}, {…}, {…} ]
​​​0: Object { kekv: "3130", opSum: 0, accountCode: "1010" }
1: Object { kekv: "3130", opSum: 600, accountCode: "1011" }​​​
2: Object { kekv: "3130", opSum: 0, accountCode: "2010" }
3: Object { kekv: "3130", opSum: 700, accountCode: "2011" }​​​
4: Object { kekv: "3130", opSum: 500, accountCode: "3010" }

Для остальных

3131: Array(5) [ {…}, {…}, {…}, {…}, {…} ]
​​​0: Object { kekv: "3131", opSum: 0, accountCode: "1010" }
1: Object { kekv: "3131", opSum: 400, accountCode: "1011" }​​​
2: Object { kekv: "3131", opSum: 0, accountCode: "2010" }
3: Object { kekv: "3131", opSum: 0, accountCode: "2011" }​​​
4: Object { kekv: "3131", opSum: 300, accountCode: "3010" }




3231: Array(5) [ {…}, {…}, {…}, {…}, {…} ]
​​​0: Object { kekv: "3231", opSum: 200, accountCode: "1010" }
1: Object { kekv: "3231", opSum: 0, accountCode: "1011" }​​​
2: Object { kekv: "3231", opSum: 100, accountCode: "2010" }
3: Object { kekv: "3231", opSum: 0, accountCode: "2011" }​​​
4: Object { kekv: "3231", opSum: 0, accountCode: "3010" }

Заранее благодарен ))


Ответы (2 шт):

Автор решения: Alexey
const groupByKekv = kekvCode.map(kekv => {
  const arr = input.filter(obj => kekv === obj.kekv).sort((a, b) => a.accountCode - b.accountCode)
  const isCode = arr.map(item => item.accountCode)
  accountCode.map(acc => {
    if (!isCode.includes(acc)){
      arr.push({kekv: kekv, opSum: 0, accountCode: acc})
    }
  })
  arr.sort((a, b) => a.accountCode - b.accountCode)
  return {[kekv]: arr}
})
→ Ссылка
Автор решения: Leonid

const kekvCode = [ "3130", "3131", "3231" ]

const accountCode = [ "1010", "1011", "2010", "2011", "3010" ]

const input = [
{
    kekv: '3130',
    opSum: 600,
    accountCode: '1011'
},
{
    kekv: '3130',
    opSum: 700,
    accountCode: '2011'
},
{
    kekv: '3130',
    opSum: 500,
    accountCode: '3010'
},
{
    kekv: '3131',
    opSum: 400,
    accountCode: '1011'
},
{
    kekv: '3131',
    opSum: 300,
    accountCode: '3010'
},
{
    kekv: '3231',
    opSum: 200,
    accountCode: '1010'
},
{
    kekv: '3231',
    opSum: 100,
    accountCode: '2010'
},
]

let result = kekvCode.map(kek => ({[kek]:accountCode.map(acc =>
    input.find(inp => inp.kekv == kek && inp.accountCode == acc)||{kekv: kek, opSum: 0, accountCode: acc})}));

console.log(result);
  

→ Ссылка