如何从 javascript 中的 foreach 循环中删除特定的数组元素

How to delete specific array elements from within a foreach loop in javascript

本文关键字:删除 数组元素 循环 javascript 中的 foreach      更新时间:2023-09-26
var fruit = ["apple","pear","pear","pear","banana"];

如何从此数组中删除所有"梨"果实?
我尝试了以下方法,但仍然剩下一个梨:

for(var f in fruit) {
    if ( fruit[f] == "pear" ) {
        fruit.splice(f, 1);
    }
}
for(var f in fruit) {
    document.write(fruit[f]+"<br>");        
}

输出:

apple 
pear 
banana

我做错了什么?现场演示:http://jsfiddle.net/SbxHc/

var fruit = ["apple", "pear", "pear", "pear", "banana"],
    i;
for (i = 0; i < fruit.length; ++i) {
    if (fruit[i] === "pear") {
        fruit.splice(i--, 1);
    }
}
console.log(fruit);
//["apple", "banana"]
for (var i = fruit.length - 1; i > -1; i--) {
    if (fruit[i] == "pear")
        fruit.splice(i, 1);
}
当您在

迭代数组时从数组中删除项目时,通常会向后迭代,以便当前索引在删除项目时不会跳过它们:

var fruit = ["apple","pear","pear","pear","banana"];
var i;
for (i = fruit .length - 1; i >= 0; i--) {
    if (fruit [i] === "pear") {
        fruit .splice(i, 1);
    }        
}
console.log(fruit );

如果原始数组中有很多"错误"的元素,我建议至少考虑不使用就地数组,而是将所有"正确"的元素收集到一个新数组中:

var rightFruits = [];
for (var i = 0, len = fruit.length; i < len; ++i) {
  if (fruit[i] !== 'pear') {
    rightFruits.push(fruit[i]);
  }
}
var i;
for (i = 0; i < fruits.length; i += 1) {
   if (fruits[i] == "pear") {
      fruits.splice(i, 1);
      i -= 1;
   }
}

6.4. 枚举

由于 JavaScript 的数组实际上是对象,因此 for in 语句可用于迭代数组的所有属性。不幸的是,for in不保证属性的顺序,而且大多数数组应用程序期望按数字顺序生成元素。此外,仍然存在问题从原型链中疏通意外属性。

幸运的是,常规的 for 语句避免了这些问题。JavaScript 的 for 语句类似于在大多数类 C 语言中。它由三个子句控制:第一个初始化循环,第二个是 while 条件,第三个执行增量:

var i;
for (i = 0; i < myArray.length; i += 1) {
   document.writeln(myArray[i]);
}
您也可以

使用filter

let noPears = fruits.filter(fruit => fruit != 'pear')
var i; while ((i = fruit.indexOf("pear")) > -1) fruit.splice(i,1);

请注意,IE8 及更低版本不支持 Array.indexOf。

为什么不向后迭代列表?这样,当您从列表中删除元素并且长度更改时,它不会中断循环逻辑:

var fruit = ["apple","pear","pear","pear","banana"];
for (var i = fruit.length - 1; i >= 0; i--) {
    if (fruit[i] === "pear") {
        fruit.splice(i, 1);
    }
}
console.log(fruit); // ["apple", "banana"]

如果它不关心反向迭代,你可以使用 while 和数组的 pop-function 的组合

var daltons = [ 
  { id: 1, name: "Joe" }, 
  { id: 2, name: "William" }, 
  { id: 3, name: "Jack" }, 
  { id: 4, name: "Averell" } 
];
var dalton;
while (dalton=daltons.pop()) {
  console.log(dalton.name);
}
console.log(daltons);
for(var f in fruit) {
    if ( fruit[f] == "pear" ) {
        fruit.splice(f-1, 1);
    }
}
for(var f in fruit) {
    document.write(fruit[f]+"<br>");        
}

享受