如何匹配数组中ID+颜色符合条件的对象并递增其count属性
localStorage购物车精准匹配SKU的数量递增实现
你写的双重if判断ID+颜色的匹配逻辑本身是成立的,当前代码存在几个遗漏点会导致逻辑不符合预期:
- 匹配到目标商品后没有终止循环,会继续遍历后续条目,既浪费性能,万一数组里存在同ID同色的重复脏数据还会重复累加数量
- 数量修改完成后没有把更新后的购物车数组重新写入localStorage,页面刷新后修改会丢失
- 缺少未匹配到商品的分支逻辑,这种场景下需要把新商品追加到购物车列表
parseInt没传基数参数,在特殊值场景下可能出现进制解析错误
修正后的完整实现代码如下:
// 从localStorage读取现有购物车数据,无数据时初始化为空数组 const products = JSON.parse(localStorage.getItem('cart')) || []; // newAdd 为待加入购物车的新商品对象 let product_exists = false; for (let loggedProduct of products) { // 联合判断ID、颜色两个SKU维度,完全匹配才执行数量累加 if (loggedProduct.id === newAdd.id && loggedProduct.color === newAdd.color) { product_exists = true; // 转数值时指定10进制,累加后直接赋值 loggedProduct.count = parseInt(loggedProduct.count, 10) + 1; // 命中目标后直接终止循环,避免无意义遍历 break; } } // 遍历完成后未找到匹配商品,追加新条目到购物车 if (!product_exists) { products.push({ ...newAdd, count: 1 }); } // 将更新后的购物车数据序列化后写回localStorage localStorage.setItem('cart', JSON.stringify(products));
上述逻辑中,数量递增操作只会在商品ID、颜色两个条件同时满足时触发,不会影响同ID不同颜色、或者不同ID的其他商品条目。
额外优化建议:
- 从localStorage读取购物车数据做初始化时,就把所有
count字段统一转为数值类型,后续操作不需要每次做类型转换,减少类型异常 - 如果后续商品新增其他SKU维度(比如尺寸、规格),只需要在if判断中补充对应字段的相等判断即可,逻辑完全通用
- 尽量保证购物车数组里不会出现同ID+同SKU属性的重复条目,从数据源头避免累加异常
内容的提问来源于stack exchange,提问作者Alice
相关产品推荐
相关产品推荐

