React中对象数组过滤指定对象数组多选场景失效如何解决?
逻辑错误根因
当前代码的过滤逻辑完全写反了:
你写的datatoRemove.some(f => f.email !== el.email)含义是:只要待删除列表中存在任意一个元素的email和当前遍历元素el的email不相等,就保留el。
当选中2条及以上待删除数据时,所有原数据项都会满足这个条件:
- 比如选中user2、user3待删除,遍历到el=user2时,待删除列表里的user3 email和user2不等,所以返回true,user2会被保留
- 遍历到el=user3时,待删除列表里的user2 email和user3不等,所以返回true,user3也会被保留
最终就出现了多选时删不掉任何数据的问题。
修正代码
正确逻辑是:仅保留不存在于待删除列表中的元素,即当前元素el的email在待删除列表里找不到相等项时才保留。
function add(datatoRemove) { alert("datatoRemove "+JSON.stringify(datatoRemove)) // 核心逻辑修正:只要待删除列表有匹配项就过滤掉 let myArrayFiltered = myData.filter(el => { return !datatoRemove.some(f => f.email === el.email) }) alert("filtered"+JSON.stringify(myArrayFiltered)) setMyData(myArrayFiltered) }
如果数据量较大,可以先把待删除的email存为Set,提升查找效率:
function add(datatoRemove) { const removeEmailSet = new Set(datatoRemove.map(item => item.email)) const myArrayFiltered = myData.filter(el => !removeEmailSet.has(el.email)) setMyData(myArrayFiltered) }
内容的提问来源于stack exchange,提问作者spring00
相关产品推荐
相关产品推荐

