JavaScript中能否使用for of循环实现数组元素的splice删除操作?
用for...of循环实现数组splice删除的正确姿势
嘿,我来帮你搞定这个问题!你遇到的情况挺典型的,先拆解下你代码里的问题,再给你两种靠谱的修改方案。
首先先揪出你原代码里的明显错误:
- 函数里写的
parkedCars.splice(item, 1)是笔误,你的数组变量明明叫array,得先把这个名字改对; splice的第一个参数要求是元素的索引位置,不是元素本身,你直接传item(也就是字符串'b'),JS会把它转成NaN,根本没法定位到要删的元素。
更核心的问题是:直接在for...of里修改数组(比如用splice删元素)会导致遍历异常——因为for...of是基于数组的迭代器工作的,当你删除一个元素后,数组后面的元素会往前挪一位,但迭代器的指针不会回退,要是有多个匹配项,就会跳过下一个元素。
方案1:只删除第一个匹配的元素
用array.entries()获取带索引的迭代器,这样就能拿到每个元素对应的索引,用这个索引调用splice就没问题了。删完第一个匹配项后直接break,避免遍历出问题:
let array = [ 'a', 'b', 'c' ]; function remove( letter ){ // entries()返回[key, value]形式的迭代器,这里key就是元素的索引 for( let [index, item] of array.entries() ){ if( item === letter ){ array.splice(index, 1); // 只删第一个匹配项的话,直接跳出循环就行 break; } } } remove( 'b' ); console.log( array ); // 输出: ['a', 'c']
方案2:删除所有匹配的元素
如果数组里可能有多个相同元素需要删除,倒序遍历会更稳妥——从数组末尾往前删,前面的元素移位不会影响还没遍历到的索引。我们可以把entries()返回的迭代器转成数组,再反转后遍历:
let array = [ 'a', 'b', 'b', 'c' ]; function removeAll( letter ){ // 先把entries转成数组,再反转,实现倒序遍历 for( let [index, item] of [...array.entries()].reverse() ){ if( item === letter ){ array.splice(index, 1); } } } removeAll( 'b' ); console.log( array ); // 输出: ['a', 'c']
这样不管数组里有多少个匹配元素,都能全部删除,而且不会出现遍历跳过的问题。
内容的提问来源于stack exchange,提问作者Kristen Hare
相关产品推荐
相关产品推荐

