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

时间:2012-06-15 21:25:29

标签: javascript arrays

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/

10 个答案:

答案 0 :(得分:25)

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"]

答案 1 :(得分:7)

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

答案 2 :(得分:3)

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

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 );

答案 3 :(得分:2)

如果原始数组中存在大量“错误”元素,我建议至少考虑不使用就地数组,而是将所有“正确”元素收集到一个新数组中:

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

答案 4 :(得分:1)

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]);
}

答案 5 :(得分:1)

您还可以使用filter

let noPears = fruits.filter(fruit => fruit != 'pear')

答案 6 :(得分:0)

var i; while ((i = fruit.indexOf("pear")) > -1) fruit.splice(i,1);

请注意,IE8及以下版本不支持Array.indexOf。 -_-

答案 7 :(得分:0)

为什么不向后迭代列表?这样,当您从列表中删除元素并且长度发生变化时,它不会破坏循环逻辑:

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"]

答案 8 :(得分:0)

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

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);

答案 9 :(得分:-1)

for(var f in fruit) {
    if ( fruit[f] == "pear" ) {
        fruit.splice(f-1, 1);
    }
}

for(var f in fruit) {
    document.write(fruit[f]+"<br>");        
}

享受