如何基于指定索引数组删除目标数组对应元素 解决splice操作异常
问题原因
你的代码运行结果不符合预期的核心原因是:删除数组靠前的元素后,数组后续元素的索引会自动前移1位。
比如你示例中的arr1 = [0,2]:
- 第一步删除索引
0的元素后,原数组arrObj变成[4,6,7,21,17,12],原来索引为2的元素6现在的索引已经变成了1 - 第二步你还按原始索引
2去删除,就会删掉当前索引为2的元素7,最终结果不符合要求。
方案1:倒序遍历索引数组(适配你的场景,最优)
题目明确说明索引数组arr1始终为升序排序,我们可以从最大的索引开始倒序删除,删除大索引不会影响还未处理的小索引的实际位置:
for(let i = arr1.length - 1; i >= 0; i--){ arrObj.splice(arr1[i], 1) }
运行你的示例逻辑:
- 先删除索引
2的元素6,此时数组变成[1,4,7,21,17,12],索引0的元素仍然是1,没有发生位移 - 再删除索引
0的元素1,最终得到[4,7,21,17,12],完全符合预期。
方案2:生成新数组(不修改原数组,通用性更强)
如果需要保留原数组,或者不确定索引数组的排序规则,可以用filter直接过滤掉需要删除的索引对应的元素:
const deleteIndexSet = new Set(arr1) const result = arrObj.filter((item, index) => !deleteIndexSet.has(index))
该方法不需要修改原数组,也不需要依赖索引数组的排序规则,适用场景更广泛。
内容的提问来源于stack exchange,提问作者Sushant Rad
相关产品推荐
相关产品推荐

