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

如何在javascript中从foreach循环中删除特定数组元素,javascript,arrays,Javascript,Arrays,如何从该阵列中移除所有“梨”果实? 我尝试了以下方法,但仍然有一个梨: var fruit = ["apple","pear","pear","pear","banana"]; ​我做错了什么?现场演示:var-fruit=[“苹果”、“梨”、“梨”、“梨”、“香蕉”], 我 对于(i=0;i

如何从该阵列中移除所有“梨”果实?
我尝试了以下方法,但仍然有一个梨:

var fruit = ["apple","pear","pear","pear","banana"];
​我做错了什么?现场演示:

var-fruit=[“苹果”、“梨”、“梨”、“梨”、“香蕉”],
我
对于(i=0;i
用于(水果中的f型变量){
if(水果[f]=“梨”){
果.剪接(f-1,1);
}
}
for(水果中的变量f){
文件。写(果[f]+“
”; }

享受

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

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

for(var f in fruit) {
    document.write(fruit[f]+"<br>");        
}
var rightFruits=[];
对于(变量i=0,len=fiult.length;i
当您在数组上迭代时从数组中删除项时,通常会向后迭代,以便在删除项时当前索引不会跳过这些项:

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

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

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

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

如果不想反向迭代,可以结合使用while和array的pop函数

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

您还可以使用
过滤器

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

等等
f
甚至不是索引(数字)
fruit=fruit.filter(函数(f){returnf!=“pear”;})谢谢!我必须使用像你这样的循环吗?也可以使用foreach变量吗?试试这个。@Nick不,不可能。无论如何,你不应该在数组中使用“++i”或“i++”,以防万一,上面的代码中是“++”还是“i++”并不重要。那么,
水果[i]==“pear”
部分在哪里呢?oeps,对maka来说,这是一个多么大的错误,;-)谢谢,我们以前用C#做过这种方法。这样做比使用splice()更昂贵吗?@Derek快速提问:数组是如何在JavaScript中实现的?@Nick:除非是一个大型集合,否则不要担心性能。我想当有大量删除时,
.push()
可能会更快,因为每次删除项目时,
.splice()
都需要从当前点向前重新索引数组。只有测试才能证明。@amnotiam是的,你是对的;这完全取决于“坏/好”元素的比例,但拼接通常是一项成本高昂的操作——特别是如果重复拼接,并且使用的阵列很大的话。回答我自己的问题——的确如此!很遗憾,这件事在……方面做不到,但我想我只是太懒了P
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;
   }
}
var i;
for (i = 0; i < myArray.length; i += 1) {
   document.writeln(myArray[i]);
}
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 i; while ((i = fruit.indexOf("pear")) > -1) fruit.splice(i,1);
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"]
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);
let noPears = fruits.filter(fruit => fruit != 'pear')