我有这个JSFiddle:https://jsfiddle.net/99efL4xz/2/
部分JS:
function addToBasket(title, sku, price, image, qty) {
// update sku if product is already present
$.each(basket, function (product) {
if (basket[product].sku === sku) {
basket[product].sku = sku; // replace existing Qty
saveBasket();
return;
}
});
// create object
var item = { title: title, sku: sku, price: price, image: image, qty: qty };
basket.push(item);
saveBasket();
}
的问题:
答案 0 :(得分:1)
正如@MikeC指出的那样,您在sku
找到了对象,但随后将匹配的sku
分配给该属性,结果没有实际变化。
您似乎想要更新qty
。
此外,您的return
语句位于$.each
回调中,因此不会阻止$.each
下方的代码运行。
ECMAScript 6提供了许多新的Array方法,其中一种方法是.find()
。我建议使用它来定位Array中的对象,然后在找到它时更新它,或者如果没有则推送新项目。
function addToBasket(title, sku, price, image, qty) {
// update sku if product is already present
var product = basket.find(function (prod) {
return prod.sku === sku
})
if (product) { // found an object, so update it with the new quantity
product.qty = qty
} else { // no object found, so create a new object
basket.push({ title: title, sku: sku, price: price, image: image, qty: qty });
}
saveBasket();
}
回调到.find()
的返回值确定数组中的当前项是否是您想要的。返回true
(或任何truthy值)使迭代停止,并为您提供该对象。如果没有项目返回真值,则返回undefined
。
然后在循环之后,如果找到了一个对象,则更新它,如果没有,则更新一个。
您需要将.find()
修补到旧版浏览器中。我链接的MDN文档中有一个polyfill。