Сравнение значения в масииве со значением в свойстве объекта
Пытаюсь на 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);