【问题标题】:Update object values on queue basis基于队列更新对象值
【发布时间】:2020-04-22 23:18:23
【问题描述】:

我有以下问题:我有一个物品清单数组,其中每个物品都是在不同时间和成本购买的相同产品。进行销售后,我想根据已售出的单位获得平均成本,然后返回更新后的对象数组(或新的数组)以及这些属性的更新值(在这种情况下,数量会减少,直到达到 0并移动到下一个对象)。

例如,具有以下清单对象数组:

"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
    }
]

数组的对象已经按日期排序。我认为这个问题很容易解决,但我已经被困了好几天试图解决这个问题。任何帮助将不胜感激。

【问题讨论】:

  • 不清楚你为什么用“队列”标签来标记它。你有对象的array,还是对象的queue?队列看起来不适合用于解决此问题的数据结构。
  • 我将其标记为“队列”,因为这些元素是在先进先出的基础上使用的(如果您进行销售,您会从最旧的对象中减少库存数量)。很抱歉,如果我没有澄清这一点。

标签: javascript queue fifo


【解决方案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));

【讨论】:

    猜你喜欢
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 2021-05-14
    • 2016-02-20
    • 2014-06-06
    相关资源
    最近更新 更多