2013-08-17 35 views
1

我有以下代碼:在循環中取消設置javascript數組?

$.each(current, function(index, value) { 
    thisArray = JSON.parse(value); 
    if (thisArray.ttl + thisArray.now > now()) { 
     banned.push(thisArray.foodID); 
    } 
    else{ 
     current.splice(index,1); 
    } 
    }); 

有下面的行了一個問題:

current.splice(index,1); 

什麼情況是,它(可能)取消符合該else條件,然後在第一種情況下它必須再次發生,鑰匙不再匹配,它不能解除其他任何事情。它只有一次,但不在以下迭代中。

有沒有解決這個問題?

+0

你碰巧有一個JSON字符串數組? – Bergi

+0

[刪除多個對象從Javascript數組中斷一半]的確切副本(http://stackoverflow.com/questions/18260784/removing-multiple-objects-from-javascript-array-breaks-half-way-through)。你不允許改變由'each'循環的數組 – Bergi

回答

2

您可以使用常規for循環,循環向後:

for(var i=current.length-1; i>= 0; i--) { 
    var thisArray = JSON.parse(current[i]); 
    if (thisArray.ttl + thisArray.now > now()) { 
     banned.push(thisArray.foodID); 
    } else { 
     current.splice(i, 1); 
    } 
}); 

而且似乎thisArray實際上是一個對象,而不是一個數組...

0

,你可以使用普通的for循環,但拼接後,由1

for(var i=0; i<current.length; i++){ 
    current.splice(i, 1); i--; 
    } 
0

減少指數如果發生變異數組(通過移動物體)你要注意,同時它正被遍歷,因爲有些元素可能像你的情況一樣跳過。

當您撥打current.splice(index, 1)元素index將被刪除,元素index+1將取代它。但index將會遞增,從而跳過一個元素。

一個更好的解決方案是IMO的讀寫方法。你讓一個指數作爲「讀指示器」和你總是增加它,而另一指數(「寫指針」),當你決定一個元素應保持在數組中只增加:

var wp = 0; // The "write pointer" 
for (var rp=0; rp<a.length; rp++) { 
    if (... i want to keep element a[rp] ...) { 
     a[wp++] = a[rp]; 
    } 
} 
a.splice(wp); // Remove all elements after wp 

這是一個o(N)操作,並將最多移動每個元素一次。其他方法(如從頭開始並使用相同的splice(i, 1)方法)會在每次需要刪除某個元素時繼續移動所有元素(i)。