Обновлять значения объекта на основе очереди - PullRequest
1 голос
/ 23 апреля 2020

У меня есть небольшая проблема со следующим: у меня есть инвентарный массив объектов, где каждый объект представляет собой один и тот же продукт, приобретенный в разное время и по разной стоимости. После продажи я хочу получить среднюю стоимость, основанную на проданных единицах, а затем вернуть обновленный массив объектов (или новый) с обновленным значением этих свойств (в этом случае уменьшающееся количество, пока оно не достигнет 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
    }
]

Объекты массива уже упорядочены по дате. Я думал, что эту проблему будет довольно просто решить, но я застрял в течение нескольких дней, пытаясь понять это. Любая помощь будет оценена.

1 Ответ

1 голос
/ 23 апреля 2020

Если значения отсортированы, вы можете использовать for of l oop и обрабатывать элементы.

Взгляните на предлагаемое решение.

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));
...