суммировать объект

Всем привет подскажите есть объект как сделать так что суммировалась по warehousePrice и по дате

[
     {
      "date": "2023-10-01",
      "nmId": 11111111,
      "warehousePrice": 100
     },
     {
      "date": "2023-10-01",
      "nmId": 222222,
      "warehousePrice": 200
     },
     {
      "date": "2023-10-01",
      "nmId": 11111111,
      "warehousePrice": 300
     },
     {
      "date": "2023-10-02",
      "nmId": 222222,
      "warehousePrice": 150
     },
     {
      "date": "2023-10-02",
      "nmId": 11111111,
      "warehousePrice": 500
     },
     {
      "date": "2023-10-02",
      "nmId": 222222,
      "warehousePrice": 300
     },
]

Итог:

[
     {
      "date": "2023-10-01",
      "nmId": 11111111,
      "warehousePrice": 400
     },
     {
      "date": "2023-10-01",
      "nmId": 222222,
      "warehousePrice": 200
     },
    {
      "date": "2023-10-02",
      "nmId": 11111111,
      "warehousePrice": 150
     },
     {
      "date": "2023-10-02",
      "nmId": 222222,
      "warehousePrice": 450
     },
]

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

Автор решения: Stanislav Volodarskiy

Строим карту по ключевым полям, накапливаем в значениях суммы, возвращаем в виде массива:

const group = list => {
    const m = new Map();
    for (const item of list) {
        const {date, nmId, warehousePrice} = item;
        const key = JSON.stringify([date, nmId]);
        if (!m.has(key)) {
            m.set(key, {date, nmId, warehousePrice});
        } else {
            m.get(key).warehousePrice += warehousePrice;
        }
    }
    return Array.from(m.values());
};

console.log(group([
    { "date": "2023-10-01", "nmId": 11111111, "warehousePrice": 100 },
    { "date": "2023-10-01", "nmId": 222222  , "warehousePrice": 200 },
    { "date": "2023-10-01", "nmId": 11111111, "warehousePrice": 300 },
    { "date": "2023-10-02", "nmId": 222222  , "warehousePrice": 150 },
    { "date": "2023-10-02", "nmId": 11111111, "warehousePrice": 500 },
    { "date": "2023-10-02", "nmId": 222222  , "warehousePrice": 300 }
]));

→ Ссылка