如何对比产品数组找出需删除项?基于productId筛选差异元素
解决从旧产品数组中筛选需删除元素的问题
需求明确
我们需要从oldProductsArray中找出所有不在当前选中的listSelectedProducts里的产品,这些条目就是需要从数据库删除的内容。
原代码问题分析
你的代码存在几个关键错误:
- 变量名不匹配:函数参数是
oldProductsArray,但代码里误用了未定义的oldProducts变量,直接导致执行报错。 - 逻辑方向颠倒:你遍历的是
listSelectedProducts,但我们需要检查的是旧数组中的元素是否存在于新选中列表,应该以oldProductsArray为遍历主体。 - 数组方法滥用:
some的回调里使用了无效的逗号表达式,还错误地在回调内执行push操作——some的作用是判断是否存在满足条件的元素,并非用于遍历收集数据。
解决方案与代码实现
正确的思路是先提取当前选中产品的productId并存入集合(提升查找效率),再筛选旧数组中不在该集合内的元素:
checkOldProduct(oldProductsArray, listSelectedProducts) { // 提取当前选中产品的productId,存入Set实现O(1)快速查找 const selectedProductIds = new Set(listSelectedProducts.map(item => item.productId)); // 筛选旧数组中不在选中集合里的产品,得到待删除列表 const arrayProductToDelete = oldProductsArray.filter(oldProd => { return !selectedProductIds.has(oldProd.productId); }); // 此处可添加数据库删除逻辑,例如遍历待删除列表发起DELETE请求 // arrayProductToDelete.forEach(prod => { // fetch(`/api/products/${prod.productId}`, { method: 'DELETE' }); // }); return arrayProductToDelete; }
测试验证
用你给出的场景测试:
当oldProductsArray = [{name: "prod1", productId: 1}],listSelectedProducts = [{name: "prod2", productId: 2}]时:
selectedProductIds为Set {2}- 筛选后
arrayProductToDelete会得到[{name: "prod1", productId: 1}],完全符合预期。
内容的提问来源于stack exchange,提问作者Jack23
相关产品推荐
相关产品推荐

