Как посчитать остаток товара на каждом складе JS

Пытаюсь вывести в таблицу информацию по остаткам на складе. Есть массив с несколькими объектами вида:

    [
        {
            "warehouse": "Производство",
            "product_id": 1,
            "operation_id": 1,
            "product_name": "Веревка",
            "warehouse_id": 1,
            "operation_type": "Вычет",
            "product_amount": 3
        }
    ],
    [
        {
            "warehouse": "Производство",
            "product_id": 1,
            "operation_id": 0,
            "product_name": "Веревка",
            "warehouse_id": 1,
            "operation_type": "Приход",
            "product_amount": 12
        }
    ]
]

Все что получилось сделать, это сгруппировать их по складам, а дальше как вычислять разность по нескольким условиям не понимаю. На выходе нужно получить массив объектов c такими данными.

[
          {
            "warehouse": "Производство", // Склад, на котором хранится товар
            "product_name": "Веревка", // Сам товар
            "product_amount": 9 //Здесь разница между этим товаром на складе в документе "Приход" и товаром в документе "Вычет" 
           }
]

Надеюсь понятно объяснил, заранее спасибо за помощь.


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

Автор решения: Alex Krass

Очень странные условия, учитывая что там массив для массивов объектов (а по факту по одному объекту) и при этом должны складываться склады, у которых разный warehouse_id. В любом случае это чистая задача на использование метода reduce

let info = [
     [
        {
            "warehouse": "Производство",
            "product_id": 1,
            "operation_id": 1,
            "product_name": "Веревка",
            "warehouse_id": 1,
            "operation_type": "Вычет",
            "product_amount": 3
        }
    ],
    [
        {
            "warehouse": "Производство",
            "product_id": 1,
            "operation_id": 0,
            "product_name": "Веревка",
            "warehouse_id": 2,
            "operation_type": "Приход",
            "product_amount": 12
        }
    ]
]

let result = info.reduce((acc, current) => {
    let item = current.at(0);
    if (!acc.find(x => x.warehouse === item.warehouse && 
                       x.product_name === item.product_name)) 
        acc.push({ 
            "warehouse" : item.warehouse, 
            "product_name" : item.product_name, 
            "product_amount" : 0
        });
    
    acc.filter(x => x.warehouse === item.warehouse && 
                    x.product_name === item.product_name)
       .at(0)
       .product_amount += (item.operation_type === "Вычет" 
           ? -item.product_amount 
           : item.product_amount)

    return acc;
}, [])

console.log(result)

→ Ссылка