如何使用可变方法从二维数组ground中移除与deleteBlock重复的元素
问题解决:原地删除二维数组中指定重复行
你的代码存在两个核心问题:
filter本质是创建新数组的方法,和你要原地修改原数组的需求完全不符;- 在
filter遍历过程中调用splice删除元素,会打乱原数组的索引顺序,导致部分元素被跳过遍历;同时splice返回的是被删除的子数组(属于真值),会让filter错误地保留这些元素。
要实现原地修改ground数组,删除所有和deleteBlock中内容重复的行,可以按以下方式编写代码:
// 先把要删除的行转成字符串,存入Set提升查找效率 const deleteRowStrings = new Set(deleteBlock.map(row => row.join())); // 从后往前遍历数组,避免删除元素导致的索引混乱 for (let i = ground.length - 1; i >= 0; i--) { const currentRowStr = ground[i].join(); if (deleteRowStrings.has(currentRowStr)) { ground.splice(i, 1); // 原地删除当前行 } }
代码说明
- 用
Set存储要删除的行字符串,每次查找的时间复杂度为O(1),比反复遍历deleteBlock对比内容高效得多; - 从后往前遍历:删除索引
i的元素后,前面未遍历的元素索引不会受影响,不会出现漏遍历的情况; splice(i, 1)直接在原数组上删除指定行,完全符合你要求的使用可变方法、不创建新数组的需求。
测试你的示例数组后,ground会只剩下前面27行全0数组,目标的三行重复内容会被成功删除。
内容的提问来源于stack exchange,提问作者kirk0201
相关产品推荐
相关产品推荐

