gpt4 book ai didi

javascript - 如何检查本地存储中是否已存在项目/值

转载 作者:行者123 更新时间:2023-12-03 05:29:03 28 4
gpt4 key购买 nike

我正在开发一个购物车应用程序,用户可以单击“添加到购物车”按钮,然后将特定项目添加到本地存储。当用户将产品添加到购物车时,我需要能够检查该特定项目/值/产品是否已存在于本地存储中。如果是,我只需将该项目/值/产品的计数增加 1。如果不是,我需要将一个全新的项目/值/产品添加到本地存储,计数为 1。

如何查找本地存储中是否已存在某个商品,并将其与用户尝试添加到购物车的当前产品的 ID 进行比较?我的前几次尝试都惨遭失败,并且尚未在网上找到任何可以帮助解决此问题的内容。有更好的方法来解决这个问题吗?如有任何帮助,我们将不胜感激。即使是一个指向好页面的好链接也会非常有帮助。

下面是我必须尝试检查添加的产品 ID 是否与本地存储中的任何产品 ID 匹配的代码。基本上,如果要添加的 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 或未定义。所以目前我的设置如下:

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:对象]。我一直被困在这个问题上,但没能让它发挥作用。再次强调,任何帮助将不胜感激。

最佳答案

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
});
}
}

请注意,您不应该将新条目推送到数组中;只需更新现有的即可。

关于javascript - 如何检查本地存储中是否已存在项目/值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41028598/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com