JS中for...in遍历数组时match()匹配相同元素仅部分生效的问题
问题原因及解决方案
你用for...in遍历数组并通过splice删除元素时,会因为数组索引的动态变化导致部分元素被跳过,具体原因如下:
for...in是按数组原始的索引(字符串类型的键)依次遍历,比如初始数组索引为"0"、"1"、"2"..."8"- 当你删除索引
subject_index的元素后,数组后续元素会向前移动一位,占据被删除元素的索引位置。但for...in仍会按原始索引顺序继续遍历,比如删除索引0后,原来的索引1的元素移到了索引0,但下一次遍历会直接到索引1,跳过了现在在索引0的元素,导致这个元素没被检查和删除。 - 这种索引错位会持续发生,最终导致约一半的元素被跳过,所以9个元素只删除了5个,剩下4个。
解决方案1:倒序for循环
倒序遍历可以避免索引错位问题,因为删除当前元素后,前面的元素索引不受影响:
for (let i = subjects.length - 1; i >= 0; i--) { if (subjects[i].match(/.*Overview of Investor.*/i)) { subjects.splice(i, 1); } }
解决方案2:使用filter方法(更简洁)
filter会返回一个新数组,包含所有符合条件的元素,这里我们保留不匹配的元素,等价于删除匹配的元素:
subjects = subjects.filter(subject => !subject.match(/.*Overview of Investor.*/i));
解决方案3:使用while循环遍历
通过控制索引的方式,确保每个元素都被检查:
let i = 0; while (i < subjects.length) { if (subjects[i].match(/.*Overview of Investor.*/i)) { subjects.splice(i, 1); } else { i++; // 只有不删除时才递增索引 } }
内容的提问来源于stack exchange,提问作者mojones101
相关产品推荐
相关产品推荐

