I am developing a food cart function where I am adding products to the cart. My cart is an Array type and the product is an object with key-values. The problem I am facing is, whenever I am trying to add a new product with a different value for a similar key, it overwrites the value of the same key for the old product as well. As per my understanding, an array is just a reference pointing to my product object but I want to know, what is the best method to resolve this issue? Here is how my code structure looks like:
component.ts
this.cartService.add(product); // <- This Product contains key modifier: ["abc","def"]
cartService.ts
add(product) {
product.qty = 1;
product.total = product.price;
this.cart.push(product);
}
So every time I push the product to the cart with a different modifier key (for example -> modifier: ["dfg", "gght"]), it overwrites the existing this.cart array objects with a new value for all modifier keys.
Here is how the two products inside my this.cart array gets logged:
(2) [{…}, {…}]
0:
category: "-M9JfAlqr_JiAiPTugc5"
description: "zxfsfsafas afa fsaff fsf safsa sfaf safs afsafa fas asf safs af aasf asfa asf ."
isAvail: true
key: "-MMWt2wDMVaHqj45eKFg"
modifiers: ["-MLxJCw0s0uDYSXYokz1"]
name: "Single Modifier"
price: 23
qty: 1
selectedModifiers: ["Corn"] // <- This is initially empty when I added this product but after adding second product this also took the value of second.
total: 23
__proto__: Object
1:
category: "-M9JfAlqr_JiAiPTugc5"
description: "zxfsfsafas afa fsaff fsf safsa sfaf safs afsafa fas asf safs af aasf asfa asf ."
isAvail: true
key: "-MMWt2wDMVaHqj45eKFg"
modifiers: ["-MLxJCw0s0uDYSXYokz1"]
name: "Single Modifier"
price: 23
qty: 1
selectedModifiers: ["Corn"] // <- This is correct but after adding this product, this selectedModifiers value also gets added to first product. See above.
total: 23
__proto__: Object
length: 2
__proto__: Array(0)
Any idea, how can I resolve this issue optimally?
Clone the product object before modifying it
add(product) {
const clone = {...product}
clone.qty = 1;
clone.total = clone.price;
this.cart.push(clone);
}