如何在对象数组中更新对象?



我有一个包含产品的对象数组,我从产品对象中随机选择商品并添加到购物车中,然后将其存储到本地存储中。这里,每当我想添加已经存在于它的创建复制对象中的产品时,我只想增加和更新产品的quantity属性。

这是我的代码,我想实现的。

var cart = [];
var products = [
{
id: 1,
productDescription: "Iphone 14 pro",
price: 1544,
quantity: 1
},
{
id: 2,
productDescription: "OPPOF19",
price: 788,
quantity: 1
},
{
id: 3,
productDescription: "Microsoft Surface Laptop 4",
price: 2500,
quantity: 1
},
{
id: 4,
productDescription: "Fog Scent Xpressio Perfume",
price: 15,
quantity: 1
},
{
id: 5,
productDescription: "Hyaluronic Acid Serum",
price: 19,
quantity: 1
}
];
var item = products[Math.floor(Math.random() * products.length)];
if (localStorage.getItem('ItemsInCart')) {
var previousCartItems = localStorage.getItem("ItemsInCart");
cart = JSON.parse(previousCartItems);
let obj = cart.some((o, i) => {
if (o.id == item.id) {
cart[i].quantity = cart[i].quantity + 1;
localStorage.setItem("ItemsInCart", (JSON.stringify(cart)));
return true;
} else {
item.quantity = 1;
cart.push(item);
localStorage.setItem("ItemsInCart", (JSON.stringify(cart)));
return true;
}
});
} else {
item.quantity = 1;
cart.push(item);
localStorage.setItem("ItemsInCart", (JSON.stringify(cart)));
}
console.log('*******************')
console.log(cart)
console.log('*******************')

some不适合这里。find更适合于此。如果找到,则添加到购物车

var cart = [];
var products = [
{
id: 1,
productDescription: "Iphone 14 pro",
price: 1544,
quantity: 1
},
{
id: 2,
productDescription: "OPPOF19",
price: 788,
quantity: 1
},
{
id: 3,
productDescription: "Microsoft Surface Laptop 4",
price: 2500,
quantity: 1
},
{
id: 4,
productDescription: "Fog Scent Xpressio Perfume",
price: 15,
quantity: 1
},
{
id: 5,
productDescription: "Hyaluronic Acid Serum",
price: 19,
quantity: 1
}
];
var item = products[Math.floor(Math.random() * products.length)];
if (localStorage.getItem('ItemsInCart')) {
var previousCartItems = localStorage.getItem("ItemsInCart");
cart = JSON.parse(previousCartItems);
const foundInCart = cart.find(e => e.id === item.id);
if (foundInCart) {
foundInCart.quantity += 1
localStorage.setItem("ItemsInCart", (JSON.stringify(cart)));
} else {
item.quantity = 1;
cart.push(item);
localStorage.setItem("ItemsInCart", (JSON.stringify(cart)));
}
} else {
item.quantity = 1;
cart.push(item);
localStorage.setItem("ItemsInCart", (JSON.stringify(cart)));
}
console.log('*******************')
console.log(cart)
console.log('*******************')

jsfiddle

我不会用'some'来表示这种行为。也许你想使用像"map"这样的函数。这是我能想到的最简单的方法:

var item = products[Math.floor(Math.random() * products.length)]; 
if (localStorage.getItem('ItemsInCart')) {
var previousCartItems = localStorage.getItem("ItemsInCart");
cart = JSON.parse(previousCartItems);
var position = cart.map(function(object) {return object.id; }).indexOf(item.id);
var result = cart[position];
if(!result){  
item.quantity = 1;
cart.push(item);
localStorage.setItem("ItemsInCart", (JSON.stringify(cart)));
}else{
let index=cart.findIndex(x => x.id === result.id)   
cart[index].quantity++;
localStorage.setItem("ItemsInCart", (JSON.stringify(cart)));
}
} else {
item.quantity = 1;
cart.push(item);
localStorage.setItem("ItemsInCart", (JSON.stringify(cart)));
}
console.log('*******************')
console.log(cart)
console.log('*******************')

嘿,如果你仍然想使用一些数组方法来实现上述目标,你可以通过下面的方法来实现,尽管map和find方法是最合适的解决方案

var cart = [];
var products = [
{
id: 1,
productDescription: "Iphone 14 pro",
price: 1544,
quantity: 1,
},
{
id: 2,
productDescription: "OPPOF19",
price: 788,
quantity: 1,
},
{
id: 3,
productDescription: "Microsoft Surface Laptop 4",
price: 2500,
quantity: 1,
},
{
id: 4,
productDescription: "Fog Scent Xpressio Perfume",
price: 15,
quantity: 1,
},
{
id: 5,
productDescription: "Hyaluronic Acid Serum",
price: 19,
quantity: 1,
},
];
var item = products[Math.floor(Math.random() * products.length)];
console.log(item);
if (localStorage.getItem("ItemsInCart")) {
var previousCartItems = localStorage.getItem("ItemsInCart");
cart = JSON.parse(previousCartItems);
let obj;
let isAvailable = cart.some((o, i) => {
if (o.id === item.id) {
obj = o;
return true;
}
});

if (isAvailable) {
obj.quantity = obj.quantity + 1;
localStorage.setItem("ItemsInCart", JSON.stringify(cart));
} else {
item.quantity = 1;
cart.push(item);
localStorage.setItem("ItemsInCart", JSON.stringify(cart));
}
} else {
item.quantity = 1;
cart.push(item);
localStorage.setItem("ItemsInCart", JSON.stringify(cart));
}
console.log("*******************");
console.log(cart);
console.log("*******************");

jsfiddle

你把事情弄得太复杂了。

const item = products[Math.floor(Math.random() * products.length)];
const cart = JSON.parse(localStorage.getItem("ItemsInCart")) || [];
const cartItem = cart.find(cartItem => cartItem.id === item.id);
if (cartItem) {
cartItem.quantity += 1;
} else {
// just for good measure, if you're going to mutate this object later on, 
// don't push the original but a copy to the cart.
cart.push({ ...item, quantity: 1 });
}
localStorage.setItem("ItemsInCart", JSON.stringify(cart));

最新更新