8
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/

4

10 回答 10

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"]
于 2012-06-15T21:27:21.633 回答
7
for (var i = fruit.length - 1; i > -1; i--) {
    if (fruit[i] == "pear")
        fruit.splice(i, 1);
}
于 2012-06-15T21:28:27.140 回答
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 );
于 2012-06-15T21:34:16.207 回答
2

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

var rightFruits = [];
for (var i = 0, len = fruit.length; i < len; ++i) {
  if (fruit[i] !== 'pear') {
    rightFruits.push(fruit[i]);
  }
}
于 2012-06-15T21:32:46.263 回答
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]);
}
于 2012-06-15T21:33:45.327 回答
1

您还可以使用filter

let noPears = fruits.filter(fruit => fruit != 'pear')
于 2017-05-15T16:39:54.727 回答
0
var i; while ((i = fruit.indexOf("pear")) > -1) fruit.splice(i,1);

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

于 2013-08-12T03:05:22.743 回答
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"]
于 2014-10-24T21:38:00.050 回答
0

如果它不关心迭代反向,你可以使用 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);
于 2015-05-29T06:59:26.877 回答
-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>");        
}

请享用

于 2012-06-15T21:29:02.773 回答