我在以下方面有一些问题:我有一个对象库存清单,其中每个对象都是在不同时间和成本下购买的同一产品。进行销售后,我想获得基于售出单位的平均成本,然后返回具有这些属性更新值的更新后的对象数组(或新对象)(在这种情况下,减少数量直到其变为0)并移至下一个对象。
例如,a具有以下清单对象阵列:
"shirts": [
{
"purchase_id": "vsibh",
"dateOfPurchase": "17/04/2020, 22:44",
"provider": "Adidas",
"product": "Shirt",
"sku": "2390",
"cost": 50,
"quantity": 400,
"total": 20000
},
{
"purchase_id": "wLqV2",
"dateOfPurchase": "18/04/2020, 12:22",
"provider": "Adidas",
"product": "Shirt",
"sku": "2390",
"cost": 40,
"quantity": 250,
"total": 10000
},
{
"purchase_id": "tCyyT",
"dateOfPurchase": "20/04/2020, 21:17",
"provider": "Adidas",
"product": "Shirt",
"sku": "2390",
"cost": 35,
"quantity": 600,
"total": 21000
}
]
如果我卖出900件,我想获得每件衬衫的平均成本,在这种情况下为43,06((400 * 50 + 250 * 40 + 250 * 35)/ 900),并返回更新的数组,其减少的数量如下所示:
"shirts": [
{
"purchase_id": "vsibh",
"dateOfPurchase": "17/04/2020, 22:44",
"provider": "Adidas",
"product": "Shirt",
"sku": "2390",
"cost": 50,
"quantity": 0,
"total": 0
},
{
"purchase_id": "wLqV2",
"dateOfPurchase": "18/04/2020, 12:22",
"provider": "Adidas",
"product": "Shirt",
"sku": "2390",
"cost": 40,
"quantity": 0,
"total": 0
},
{
"purchase_id": "tCyyT",
"dateOfPurchase": "20/04/2020, 21:17",
"provider": "Adidas",
"product": "Shirt",
"sku": "2390",
"cost": 35,
"quantity": 350,
"total": 12250
}
]
数组的对象已经按日期排序。我认为这个问题将很容易解决,但是我已经被困了好几天试图弄清楚了。任何帮助将不胜感激。
答案 0 :(得分:1)
如果对值进行了排序,则可以使用for of
循环并处理项目。
看看提议的解决方案。
const quantity = 900;
const state = {
"shirts": [{
"purchase_id": "vsibh",
"dateOfPurchase": "17/04/2020, 22:44",
"provider": "Adidas",
"product": "Shirt",
"sku": "2390",
"cost": 50,
"quantity": 400,
"total": 20000
},
{
"purchase_id": "wLqV2",
"dateOfPurchase": "18/04/2020, 12:22",
"provider": "Adidas",
"product": "Shirt",
"sku": "2390",
"cost": 40,
"quantity": 250,
"total": 10000
},
{
"purchase_id": "tCyyT",
"dateOfPurchase": "20/04/2020, 21:17",
"provider": "Adidas",
"product": "Shirt",
"sku": "2390",
"cost": 35,
"quantity": 600,
"total": 21000
}
]
}
const compute = (state, property, quantity) => {
const values = [...state[property]];
let remainingQuantity = quantity;
let result = [];
let averageCost = 0;
for (let value of values) {
if (value.quantity < remainingQuantity) {
remainingQuantity = remainingQuantity - value.quantity;
averageCost = averageCost + (value.cost * value.quantity) / quantity;
value.quantity = 0;
value.total = 0;
} else {
if (remainingQuantity !== 0) {
value.quantity = value.quantity - remainingQuantity;
averageCost = averageCost + (value.cost * remainingQuantity) / quantity;
remainingQuantity = 0;
value.total = value.quantity * value.cost;
}
}
result = [...result, value];
}
console.log(averageCost)
return {
...state,
[property]: result
}
}
console.log(compute(state, "shirts", quantity));