Spencer Brereton
Spencer Brereton

Reputation: 51

Javascript Array value not updaing

I think I'm having trouble understanding the fundamentals of updating an array in Javascript. I have a cope snippet that is trying to do something to the effect of what I'll paste below.

I'll update the value of something in request.quantities, then the next reference to it takes the original value instead of the updated one. Can someone please explain to me where my disconnect is?

For example, the expected output for 'order' from this function should be:

[
{name: 'apple', batch: '12345', quantity: 5},
{name: 'orange', batch: '23456', quantity: 10},
{name: 'banana', batch: '34567', quantity: 3},
{name: 'banana', batch: '99999', quantity: 12},
]

But it winds up being:

[
{name: 'apple', batch: '12345', quantity: 5},
{name: 'orange', batch: '23456', quantity: 10},
{name: 'banana', batch: '34567', quantity: 3},
{name: 'banana', batch: '99999', quantity: 15},
]
        let request = {
            products:['apple', 'orange', 'banana'], 
            quantities:[5, 10, 15]
        }

        let stock = [
            {name: 'apple', batch: '12345', quantity: 50},
            {name: 'orange', batch: '23456', quantity: 1000},
            {name: 'banana', batch: '34567', quantity: 3},
            {name: 'banana', batch: '99999', quantity: 500},
        ]

        let order = []

        for (let i = 0; i < request.products.length; i++) {
            for (let j = 0; j < stock.length; j++) {
                if (request.products[i] == stock[j].name) {
                    if (stock[j].quantity - request.quantities[i] > 0) {
                        order.push({name: request.products[i], batch: stock[j].batch, quantity: request.quantities[i]})
                        stock[j].quantity = stock[j].quantity - request.quantities[i]
                        request.quantities[i] = 0
                    } else {
                        order.push({name: request.products[i], batch: stock[j].batch, quantity: stock[j].quantity})
                        stock[j].quantity = 0
                        request.quantities[i] = request.quantities[i] - stock[j].quantity
                    }
                }
            }
        }

Upvotes: 0

Views: 40

Answers (1)

jme11
jme11

Reputation: 17397

There's just a small logic error here. You need to set the request quanities in your else statement before you set the stock for that item quantity to 0.

const request = {
  products: ['apple', 'orange', 'banana'],
  quantities: [5, 10, 15],
};

const stock = [
  { name: 'apple', batch: '12345', quantity: 50 },
  { name: 'orange', batch: '23456', quantity: 1000 },
  { name: 'banana', batch: '34567', quantity: 3 },
  { name: 'banana', batch: '99999', quantity: 500 },
];

const order = [];

for (let i = 0; i < request.products.length; i++) {
  for (let j = 0; j < stock.length; j++) {
    if (request.products[i] == stock[j].name) {
      if (stock[j].quantity - request.quantities[i] > 0) {
        order.push({
          name: request.products[i],
          batch: stock[j].batch,
          quantity: request.quantities[i],
        });
        stock[j].quantity = stock[j].quantity - request.quantities[i];
        request.quantities[i] = 0;
      } else {
        order.push({
          name: request.products[i],
          batch: stock[j].batch,
          quantity: stock[j].quantity,
        });
        /* Set request quantity first */
        request.quantities[i] = request.quantities[i] - stock[j].quantity;
        stock[j].quantity = 0;
      }
    }
  }
}

console.log(order)

Upvotes: 1

Related Questions