使用 for...of 循环删除数组项

Remove array item using for...of loop

我正在尝试编辑数组并删除不满足特定条件的元素。如果我将 reverse for loop.splice(index,n) 结合使用,代码就可以正常工作。我坚持使用 ES6 for...of 循环

实现相同的功能
let array=[1,2,3];
//reverse for loop
for(var i=array.length - 1; i>=0; i--) {
  if(array[i]>=2) {
    /*Collect element before deleting it.*/
    array.splice(i,1);
  }
} 
console.log(array);
// returns [1]

用于..of

let array=[1,2,3];
for(let entry of array) {
    if(entry>=2) {
        let index = array.indexOf(entry);

        /*The array is being re-indexed when I apply 
        .splice() - the loop will skip over an index
        when one element of array is removed*/

        array.splice(index, 1);
    }
} 
console.log(array);
//returns [1,3]

有没有一种方法可以使用 for...of 循环来实现此功能,还是我必须坚持使用 reverse for loop

更新
我需要将不符合 filter()reverse for loop 函数删除的元素的条目收集到辅助数组。

你不能合理地为此使用for-of。如果在迭代期间删除 "current" 条目,您将跳过下一个条目,因为指定数组迭代器的方式(它们使用条目的索引)。你可以通过这个人为的例子看到:

const array = [1, 2, 3];
for (const entry of array) {
    console.log(entry);
    if (entry === 2) {
        array.splice(1, 1);
    }
}
console.log(array);

注意条目 3.

没有循环迭代

我建议要么坚持使用反向 for 循环,要么使用 filter 生成一个仅包含您要保留的条目的新数组。

使用filter:

let array = [1, 2, 3];
array = array.filter(entry => entry < 2);
console.log(array);


我在上面说 "reasonably" 因为,当然,总有办法。您可以遍历数组的副本并在其外部维护 index

const array = [1, 2, 3];
let index = 0;
for (const entry of [...array]) {
    if (entry >= 2) {
        array.splice(index, 1);
    } else {
        ++index;
    }
}
console.log(array);

与其他选择相比,这似乎不合理,当然除非有限制迫使您那样做。 :-)

迭代器在删除数组中的当前条目时跳过下一个条目。所以你应该通过这种方式来达到你想要的结果。

let array = [1,2,3];
let array_new = [1,2,3];
for(let entry of array) {
if(entry>=2) {
    let index = array_new.indexOf(entry);
    array_new.splice(index, 1);
}
} 
console.log(array_new);
//returns [1]

根据 ,当使用 for...of 循环时:

If you remove the "current" entry during the iteration, you'll skip the next entry, because of the way array iterators are specified (they use the index of the entry).

这留下了另外两个选项,使用 reverse for loopfilter 函数。前面提到删除前需要对当前数组元素进行操作

1.使用 .filter() 函数
并参考

let array = [1,2,3];
let collection = [];

array = array.filter(function(entry) {
    if(entry>=2) {
        collection.push(entry);
    } 
    return entry <2;
});

console.log(collection); //returns [2,3]
console.log(array); //returns [1]

2。使用 reverse for loop

let array = [1,2,3];
let collection = [];

for(var i=array.length - 1; i>=0; i--) {
  if(array[i]>=2) {
     collection.push(array[i]);
     array.splice(i,1);
  }
}

console.log(collection); //returns [2,3]
console.log(array); //returns [1] 

本例中的filter()函数需要额外的一步,暂时持有不满足条件的元素。 reverse for loop 提供了一种更简洁的方法来实现相同的目的。