Переформировать объект JS
Нужно объединить одинаковые товары в один.
Как из этого:
[
{
"nomenclature": "Арматура 10",
"quantity_m": 1801,
"residue": {
"name": "Арматура 10 УзМетКом",
"m_tonne": 1620,
"qty": 10928
},
"date": "2020-03-01"
},
{
"nomenclature": "Арматура 10",
"quantity_m": 703,
"residue": {
"name": "Арматура 10 УзМетКом",
"m_tonne": 1620,
"qty": 10928
},
"date": "2020-03-01"
},
{
"nomenclature": "Арматура 16",
"quantity_m": 560,
"residue": {
"name": "Арматура 16 ТТЗ",
"m_tonne": 1312,
"qty": 9873
},
"date": "2020-03-02"
},
]
сделать вот это:
[
{
"nomenclature": "Арматура 10",
"arr": [
{"quantity_m": 1801, "date": "2020-03-01"},
{"quantity_m": 703, "date": "2020-03-01"},
]
"residue": {
"name": "Арматура 10 УзМетКом",
"m_tonne": 1620,
"qty": 10928
},
},
{
"nomenclature": "Арматура 16",
"arr": [
{"quantity_m": 560, "date": "2020-03-02"},
]
"residue": {
"name": "Арматура 16 ТТЗ",
"m_tonne": 1312,
"qty": 9873
},
},
]
Пробовал так, но это не то, что мне нужно:
function UniqProd(name, qty, date) {
this.name = name;
this.item = [{
this.qty = qty,
this.date = date
}]
}
var mycar;
data.forEach((item, index) => {
mycar = new UniqProd(item.nomenclature, item.quantity_m, item.date);
});
Ответы (1 шт):
Автор решения: Dmitrii Sedov
→ Ссылка
Можно сделать таким образом.
const input = [
{
"nomenclature": "Арматура 10",
"quantity_m": 1801,
"residue": {
"name": "Арматура 10 УзМетКом",
"m_tonne": 1620,
"qty": 10928
},
"date": "2020-03-01"
},
{
"nomenclature": "Арматура 10",
"quantity_m": 703,
"residue": {
"name": "Арматура 10 УзМетКом",
"m_tonne": 1620,
"qty": 10928
},
"date": "2020-03-01"
},
{
"nomenclature": "Арматура 16",
"quantity_m": 560,
"residue": {
"name": "Арматура 16 ТТЗ",
"m_tonne": 1312,
"qty": 9873
},
"date": "2020-03-02"
},
];
const result = input.reduce((res, item) => {
let isUpdate = false;
res = res.map((resItem) => {
if (resItem.nomenclature == item.nomenclature) {
resItem = checkItem(resItem, item);
isUpdate = true;
}
return resItem;
});
if (!isUpdate) {
const {residue, nomenclature, quantity_m, date} = item;
res.push({
residue,
nomenclature,
arr: [{
quantity_m,
date
}]
});
}
return res;
}, []);
function checkItem(resItem, item) {
let isUpdate = false;
resItem.arr = resItem.arr.map(current => {
if (current.date == item.date) {
current.quantity_m += item.quantity_m;
isUpdate = true;
}
return current;
});
if (!isUpdate) {
resItem.arr.push({
quantity_m: item.quantity_m,
date: item.date
});
}
return resItem;
}
console.log(result);
UPD Дополнил ответ