如何正确筛选arraySavedItems中不在arraySelectedItems的元素生成arrayDeletedItems
问题分析与修正方案
原代码的核心问题
你的代码逻辑存在两处关键错误:
find回调逻辑混乱:find的回调里只要当前itemSaved和任意一个itemSel的id不等就执行push,这会导致同一个itemSaved被多次添加到结果数组(比如item1会和item2比较时触发push)。filter回调无有效返回值:原filter的回调没有明确返回布尔值,导致过滤逻辑完全失效,无法正确筛选目标元素。
正确实现方式
我们只需要筛选出arraySavedItems中id不在arraySelectedItems里的元素,以下是两种简洁可靠的实现方案:
方案一:提前提取ID集合(性能更优)
先把选中项的id提取成数组,再用includes快速判断,时间复杂度从O(n*m)降到O(n+m):
// 提取选中项的id集合,避免重复遍历 const selectedIds = arraySelectedItems.map(item => item.id); // 筛选saved中不在选中集合里的元素 const arrayDeletedItems = arraySavedItems.filter(itemSaved => !selectedIds.includes(itemSaved.id));
方案二:直接逐元素匹配(逻辑直观)
如果不想提前处理id集合,也可以用some直接判断元素是否存在:
const arrayDeletedItems = arraySavedItems.filter(itemSaved => { // 判断当前saved元素是否在选中数组中存在(通过id匹配) return !arraySelectedItems.some(itemSel => itemSel.id === itemSaved.id); });
测试验证
测试用例1:两数组完全一致
const arraySelectedItems = [{id: 1, name: "item1"}, {id: 2, name: "item2"}]; const arraySavedItems = [{id: 1, name: "item1"}, {id: 2, name: "item2"}]; // 运行结果:arrayDeletedItems = []
测试用例2:saved比selected多一个元素
const arraySelectedItems = [{id: 1, name: "item1"}]; const arraySavedItems = [{id: 1, name: "item1"}, {id: 2, name: "item2"}]; // 运行结果:arrayDeletedItems = [{id: 2, name: "item2"}]
两种方案均能完全符合需求,且逻辑清晰、运行稳定。
内容的提问来源于stack exchange,提问作者Jack23
相关产品推荐
相关产品推荐

