Как посчитать остаток товара на каждом складе 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)