Переформировать объект 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 Дополнил ответ

→ Ссылка