2012-09-28 30 views
5

考慮下面的代碼:的Javascript發出用於循環

function splicer() 
{ 
var arrayElements = ["elem1","elem2","elem3","elem4"]; 
for(var index in arrayElements) 
{ 
    arrayElements.splice(index,1); 
} 
alert("Elements: "+arrayElements); 
} 

上述功能應該刪除所有來自陣列"arrayElements"的元素。但它不會。

Javascript引擎維護"index",因爲它不介意被修改的數組。 人們可能期望像"for each"循環,沒有這種問題

即使下面的代碼似乎並沒有工作:

function splicer() 
{ 
... 
for(var index in arrayElements) 
{ 
    arrayElements.splice(index--,1); 
} 
... 
} 

改變變量「指標」的價值,即使似乎沒有工作。 更改後的值可在「for(...){...}」塊中使用,但當循環到達下一次迭代時,值將重置並從下一個索引繼續作爲發條。

這樣看來這樣的代碼可能是唯一的解決辦法:

function splicer() 
{ 
var arrayElements = ["elem1","elem2","elem3","elem4"]; 
for(var index=0;index<arrayElements.length;index++) 
{ 
    arrayElements.splice(index--,1); 
} 
alert("Elements: "+arrayElements); 
} 

測試中:火狐16 Beta版。

但將一元運算符一"splice()"方法中,初看似乎被誤導。

這可能是值得考慮的​​或任何它可能涉及,以便他們提出一個很好的解決方案。

+0

http://stackoverflow.com/questions/500504/javascript-for-in-with-arrays的可能的複製 –

回答

2

您可能想要參考John Resigarray.remove()link

// Array Remove - By John Resig (MIT Licensed) 
Array.prototype.remove = function(from, to) { 
    var rest = this.slice((to || from) + 1 || this.length); 
    this.length = from < 0 ? this.length + from : from; 
    return this.push.apply(this, rest); 
}; 
+0

d這段代碼看起來不錯。但修改「盒外」數組對象聽起來不是一個好主意。順便說一下,代碼片段一眼就看不到用戶友好。這個編碼的人可能已經仔細地做了這件事,他一定非常擅長...... – Nokia808Freak

+0

@CrystalPaladin鏈接爲您提供了一個不使用原型的例子。 –

0

嘗試這種情況:

* 剪接修改原始陣列,因此TGE循環跳過替代值。 *

var arrayElements = ["elem1","elem2","elem3","elem4"]; 
arrayElements.splice(0,arrayElements.length); 
alert("Elements: "+arrayElements) 
+0

不是替代值,它只是逐步跳過。跳過第一個迭代,第二個跳過第二個,不包括第一個跳過的第一個迭代。依此類推...... – Nokia808Freak

+0

我不強調清空數組!我預計觀衆可能會想到在這種情況下可能的JavaScript行爲解決方案/解釋 – Nokia808Freak

+0

如果您看到拼接文檔 - http://www.w3schools.com/jsref/jsref_splice.asp,它顯然寫爲「This方法改變了原始數組。「讓我爲你創建一個小提琴,希望能讓事情變得清晰。我會在一段時間後發佈。 –