【发布时间】:2022-07-21 04:37:59
【问题描述】:
所以我正在尝试实现一个函数,该函数允许我在具有 3 个属性的 JS 对象内存储本地沙发的详细信息:
-
一个ID(通过函数被产品的URL覆盖)
-
颜色(通过事件监听器恢复)
-
数量(恢复方式与颜色相同)
我已经拥有允许我使用数组在本地存储对象的功能:
function addedToCart(productObject) {
let listOfProducts = getProducts();
listOfProducts.push(productObject);
registerProducts(listOfProducts);
}
function getProducts() {
let listOfProducts = localStorage.getItem("listOfProducts");
if (listOfProducts == null) {
return [];
} else {
return JSON.parse(listOfProducts);
}
}
function registerProducts(listOfProducts) {
localStorage.setItem("listOfProducts", JSON.stringify(listOfProducts));
}
最后,我有 3 个事件监听器:
- 在用户选择选项时进行监听并获取颜色值
- 监听
<input type="number"/>的变化,获取数量的值 - 在用户点击“添加到购物车”按钮时进行监听
这是我的 JS 代码
class classProductCartDetails {
constructor(id, color, quantity) {
this.id = id;
this.color = color;
this.quantity = quantity;
}
}
let quantityProduct = document.getElementById("quantity");
let valid = true;
let colorValue = 0;
let quantityValue = 0;
itemColors.addEventListener("change", function (event) {
colorValue = event.target.value;
console.log(colorValue);
});
quantityProduct.addEventListener("input", function (event) {
quantityValue = event.target.value;
console.log(quantityValue);
});
addToCartButton.addEventListener("click", function () {
if (quantityValue > 0 && quantityValue <= 100 && colorValue != 0) {
let objectProduct = new classProductCartDetails(
productId,
colorValue,
quantityValue
);
console.table(objectProduct);
alert("Your product has been added to the cart!");
addedToCart(objectProduct);
}
if(colorValue == 0 && quantityValue <= 0){
alert("WARNING! You must add the details of the product");
}
else if (colorValue == 0) {
alert("WARNING! You must add a color");
}
else if (quantityValue <= 0) {
alert("WARNING! The quantity inputted is invalid");
}
});
问题?如果我只是点击两次“添加到购物车”按钮,或者如果我更改沙发的数量然后点击按钮,它将添加一个冗余 向数组添加新对象实例!
[{id: "107fb5b75607497b96722bda5b504926", color: "White", quantity: "1"},…]
0: {id: "107fb5b75607497b96722bda5b504926", color: "White", quantity: "1"}
1: {id: "107fb5b75607497b96722bda5b504926", color: "Blue", quantity: "1"}
2: {id: "107fb5b75607497b96722bda5b504926", color: "Blue", quantity: "1"}
3: {id: "107fb5b75607497b96722bda5b504926", color: "Blue", quantity: "2"}
如您所见,我们有 3 次相同的对象,2 次相同,1 次具有不同的数量。
我想实现一个函数,允许我单独检查一个对象的 ID、颜色和数量与数组中另一个对象的 ID、颜色和数量。
满足这些条件:
-
如果ID、颜色和数量相同→删除多余的对象 问题
-
如果只有 ID 和颜色相同但数量相同
不同→将非冗余的数量值替换为冗余对象上的最新值并删除冗余对象
例如,第一个对象的属性与第二个,然后与第三个...然后第二个对象与第一个,第二个与第三个...依此类推,直到最后一个对象数组。
英语不是我的母语,所以你可能不明白我的意思,但不用担心,下面是这张照片的视觉表现: 还有 TD:DR
-没有冗余
-检测到冗余:
1.索引为 2 和 3 的已消除对象
2.将索引为 1 的对象的数量从 1 更改为 2
这将是本地存储上 JSON 的结果:
[{id: "107fb5b75607497b96722bda5b504926", color: "White", quantity: "1"},…]
0: {id: "107fb5b75607497b96722bda5b504926", color: "White", quantity: "1"}
1: {id: "107fb5b75607497b96722bda5b504926", color: "Blue", quantity: "2"}
我已经看过一些关于如何删除数组中冗余对象的帖子,但它们是静态数组
是否可以实现这样的功能(通过递归或迭代)?是不是太牵强了?有没有更简单的方法可以去除数组中的冗余对象?
任何帮助将不胜感激
顺便说一句,如果您对我的代码有任何建议或对我的代码有任何疑问,请不要犹豫!
【问题讨论】:
-
能否提供
addedToCart函数的代码。 -
addedToCart的代码在我帖子顶部的第一个代码块中,虽然它很长,所以这里是代码:` function addedToCart(productObject) { let listOfProducts = getProducts( ); listOfProducts.push(productObject);注册产品(产品列表); } `
标签: javascript arrays class object local-storage