JavaScript如何从对象数组中正确批量删除多个指定对象
问题根源
多次调用splice删除出错的核心原因是:splice会直接修改原数组,每次执行删除操作后,数组长度会缩短,被删除位置之后的所有元素索引都会前移。提前按初始数组算好的下标,在第一次splice执行后就已经和实际数组索引不匹配了,自然会出现删错、漏删甚至出现异常值的问题。
可行方案
方案1:使用filter过滤(推荐首选)
不需要手动计算下标,直接过滤掉需要删除的项、把符合保留条件的数组重新赋值给原属性即可,逻辑清晰不会出错,也是日常开发中处理这类批量删除需求的通用写法:
// 定义所有需要删除的field值,用Set存储查询效率更高,后续增删要过滤的字段直接修改这个集合即可 const deleteFields = new Set(['ID', 'Table', 'log', 'crea', 'off']); obj2.createValues = obj2.createValues.filter(item => !deleteFields.has(item.field));
执行后obj2.createValues会保留所有field为FLD_STR_101的条目,完全匹配删除需求,不会出现索引错位问题。
方案2:倒序遍历+splice原地删除
如果有特殊场景要求不能替换原数组的引用、必须原地修改数组,可以从数组末尾往前遍历,遇到要删除的项就调用splice删除当前索引的元素。因为是从后往前删,删除操作只会影响已经遍历过的靠后元素的索引,不会干扰还没遍历到的靠前元素的下标,不会出现索引错位:
const deleteFields = new Set(['ID', 'Table', 'log', 'crea', 'off']); // 从最后一个元素开始往前遍历 for (let i = obj2.createValues.length - 1; i >= 0; i--) { if (deleteFields.has(obj2.createValues[i].field)) { obj2.createValues.splice(i, 1); } }
注意:不要用正序遍历+splice的写法,正序遍历删除元素后,下一个元素会移到当前索引位置,遍历指针继续后移就会直接跳过这个元素,导致漏删。
内容的提问来源于stack exchange,提问作者Marizona
相关产品推荐
相关产品推荐

