我正在开发购物车应用程序,用户可以单击“添加到购物车”按钮,然后将特定项目添加到本地存储。当用户将产品添加到他们的购物车时,我需要能够检查该特定项目/价值/产品是否已存在于本地存储中。如果是这样,我只需要将该项目/值/产品的数量增加1.如果不是,我需要将全新的项目/价值/产品添加到本地存储中,数量为1.
如何查找本地存储中是否已存在某个项目,并将其与用户尝试添加到购物车的当前产品的ID进行比较?我的前几次尝试失败了,并且还没有在网上发现任何有助于解决这个问题的事情。有没有更好的方法来解决这个问题?任何帮助表示赞赏。即使是与良好页面的良好链接也会非常有帮助。
以下是我必须尝试检查所添加的productid是否与本地存储中的任何产品匹配的代码。基本上,如果要添加的productId与本地存储中的项目的productId匹配,则只需将数量加1即可。
var retrieverObject = localStorage.getItem('Products');
var retrieveObject = JSON.parse(retrieverObject);
var data = {};
var productId = currentNode.name;
var product = currentNode;
data.productPrice = product.parentNode.previousSibling.previousSibling.id;
data.productId = productId;
var length = retrieveObject.length;
console.log(length);
for(var i = 0; i<length; i++){
if(retrieveObject[i].productId == data.productId){
var quantity = retrieveObject[i].quantity;
retrieveObject.push({"productPrice": data.productPrice, "productId": data.productId, "quantity": quantity++});
}else{
retrieveObject.push({"productPrice": data.productPrice, "productId": data.productId, "quantity": 1});
}
}
console.log(retrieveObject);
localStorage.setItem('Products', JSON.stringify(retrieveObject));
var retrievedObject = localStorage.getItem('Products');
var obj = JSON.parse(retrieverObject);
var len = obj.length;
console.log(len);
for(var i=0; i<len;i++){
console.log(obj[i]['productPrice']+", "+obj[i]['productId']);
}
} }
有一些问题。首先,我并不完全确定将检索到的对象的productId与正在添加的对象进行比较。其次,for(var i = 0; i<length; i++){}
肯定似乎没有按预期进行,并且正在将所添加的项目数乘以2.第三,可能与第二个问题有关,则retrieveObject.push()不会更新产品的数量,但正在向本地存储添加一个全新的条目。给出的答案似乎并没有对我有用,所以这就是我一直在努力的。任何新的答案或一般帮助都会很棒。
PT 2:所以我遇到第一次进入本地存储的问题。如果没有注意到当本地存储中没有任何内容并且您调用它来获取其中的项时,它将返回null或undefined。所以目前我的设置如下:
if(localStorage.getItem("Products") === null || localStorage.getItem("Products") === undefined){
var data = {};
var productId = currentNode.name;
var product = currentNode;
data.productPrice = product.parentNode.previousSibling.previousSibling.id;
data.productId = productId;
var obj = [];
obj = obj[data.productId] = {
productPrice: data.productPrice,
count: 1
};
console.log(obj);
localStorage.setItem('Products', JSON.stringify(obj));
}
else{
var retrieverObject = localStorage.getItem('Products');
var retrieveObject = JSON.parse(retrieverObject);
var data = {};
var productId = currentNode.name;
var product = currentNode;
data.productPrice = product.parentNode.previousSibling.previousSibling.id;
data.productId = productId;
if(retrieveObject[data.productId]){
retrieveObject[data.productId].count++;
}else{
retrieveObject[data.productId] = {
productPrice: data.productPrice,
count: 1
};
}
console.log(retrieveObject);
localStorage.setItem('Products', JSON.stringify(retrieveObject));
}
这会在本地存储中创建一个如下所示的第一个条目:{“productPrice”:“78.34”,“count”:1},然后在添加其他条目时如下所示:{“productPrice”:“78.34”, “count”:1,“rJUg4uiGl”:{“productPrice”:“78.34”,“count”:3}}并且完美无缺。问题是正确格式化b格式的第一个条目。当我更改第一个if语句中的代码时,如下所示:
var obj = [];
obj[data.productId] = {
productPrice: data.productPrice,
count: 1
}
我在本地存储中得到一个空的[]但是当我在console.log中时,obj的格式正确。 [rJUg4uiGl:Object]。我一直坚持这个并且无法让它发挥作用。再次,任何帮助将非常感激。
答案 0 :(得分:1)
在obj
中建立数据结构后,我建议您使用带有产品ID的字典作为密钥。
添加订单或其他任何地方:
obj.push({"productPrice": data.productPrice, "productId": data.productId});
使用:
if (obj[data.productId]) { // if the entry exists,
// increment the count
obj[data.productId].count++;
} else { // if it doesn't,
// add a new entry with count = 1
obj[data.productId] = {
productPrice: data.productPrice,
count: 1
};
}
这是一个完整的功能,包括localStorage
处理:
function addToCart(productID, productPrice) {
// get the current cart, or an empty object if null
var cart = JSON.parse(localStorage.getItem("Products")) || {};
// update the cart by adding an entry or incrementing an existing one
if (cart[productId]) {
cart[productId].count++;
} else {
cart[productId] = {
productPrice, // shorthand for `productPrice: productPrice,`
count: 1
};
}
// put the result back in localStorage
localStorage.setItem("Products", JSON.stringify(cart));
}
上述解决方案更受欢迎,因为您可以检查productId
而无需遍历整个列表。如果确实想要保留对象数组的当前数据结构,可以像这样更新它:
var length = retrieveObject.length;
console.log(length);
for (var i = 0; i < length; i++) {
if (retrieveObject[i].productId == data.productId) {
retrieveObject[i].quantity++; // update the entry in the array
} else {
retrieveObject.push({
productPrice: data.productPrice,
productId: data.productId,
quantity: 1
});
}
}
请注意,您不应该push
新的数组输入;只需更新现有的。
答案 1 :(得分:0)
假设您正在使用localStorage
节点包
if (localStorage.getItem('Products') !== null) {
localStorage.setItem('Products', JSON.stringify(obj));
}
以下是您的参考:
https://www.npmjs.com/package/localStorage
此致
<强>更新强>
在您的对象中搜索是另一回事......所以您想检查产品ID是否存在,然后您可以使用lodash
var _ = require('lodash');
// the rest of your code to get the data.productId set
if (localStorage.getItem('Products') !== null) {
var arrayOfProducts = localStorage.getItem('Products');
var existingProducts = _.filter(arrayOfProducts, function (product) { return product.productId === data.productId });
if (existingProducts.length > 0) {
// product found, do your logic
}
}
这是lodash信息https://www.npmjs.com/package/lodash
另一种选择是使用字典并将productId
作为key
然后使用Object.keys
来搜索它...我提供的方法不会改变你的json结构。
答案 2 :(得分:0)
只需使用localstorage.getItem
;如果密钥尚不存在,则返回null
。