2012-06-15 71 views
8
var fruit = ["apple","pear","pear","pear","banana"]; 

如何從此數組中刪除所有「pear」水果?
我嘗試以下,但還是一個梨仍然是:如何從javascript中的foreach循環中刪除特定的數組元素

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/

+2

等待...'F'甚至不是一個索引(數字)! –

+2

'fruit = fruit.filter(function(f){return f!==「pear」;});' – 2012-06-15 21:42:59

回答

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

謝謝!我必須使用類似你的循環嗎?是否也可以使用foreach變體? – Nick

+0

試試這個['[] .forEach()'](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach)。 –

+4

@Nick不,這是不可能的。無論如何你都不應該對數組使用'for..in'。 – Esailija

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

那麼'水果[i] ==「梨」部分在哪裏? –

+0

oeps,什麼是maka的mistaka,;-) – Tom

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

享受

+0

'f'不是一個數字。 –

2

如果有大量的原始數組中「錯誤」的元素的話,建議不要使用就地陣列至少考慮,而不是收集所有的 '正確' 的元件到一個新的數組:

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

謝謝,我們用C#來做這個方法。這樣做成本更高,而不是使用拼接()? – Nick

+0

一個額外的變量 –

+0

@Derek快速問題:如何在JavaScript中實現數組? – raina77ow

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不保證屬性的順序,並且大多數數組應用程序期望元素按數字順序生成。此外,還存在 從原型鏈中挖出意外屬性的問題。

幸運的是,傳統的陳述避免了這些問題。用於語句的JavaScript類似於大多數C語言中的 。它是由三個子句進行控制:所述第一初始化環路,第二個是while條件,以及第三確實增量:

var i; 
for (i = 0; i < myArray.length; i += 1) { 
    document.writeln(myArray[i]); 
} 
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); 
+0

確實!太糟糕了,不能用for ...來完成,但我想我只是懶惰。 :P – Nick

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

注意Array.indexOf不受IE8和下方支撐。 -_-

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

如果不小心反向迭代,你可以使用,而組合和陣列的彈出式功能

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

你也可以使用一個filter

let noPears = fruits.filter(fruit => fruit != 'pear') 
相關問題