2013-03-12 59 views
2

我有一段代碼,我試圖從數組中拼接一個項目。在下面的代碼中,它應該刪除具有「Javascript」的項目,結果數組應該只包含「Java」。我在這裏做錯了什麼?javascript splice問題

var autoCompleteArray = new Array(); 

var item = new Array(); 
item.push("1"); 
item.push("Java"); 
autoCompleteArray.push(item); 

var item2 = new Array(); 
item2.push("2"); 
item2.push("Javascript"); 
autoCompleteArray.push(item2); 


var val = "Javascript"; 

for(var i=0;i<autoCompleteArray.length;i++){ 

    if(autoCompleteArray[i][1] == val) { 

    autoCompleteArray.splice(autoCompleteArray[i],1); 

    } 
} 

console.log(autoCompleteArray); //Should show Java in the array since Javascript item has been removed. 
+1

你正在改變你正在迭代的數組..你正在尋找麻煩。 – DanC 2013-03-12 03:54:05

+0

爲什麼不使用'filter'? (如果需要的話,可以使用Shiv)''autoCompleteArray = autoCompleteArray.filter(function(item){return item [i]!= val;});' – Ryan 2013-03-18 20:28:34

回答

2

你在拼接錯誤的東西;這應該工作:

if(autoCompleteArray[i][1] == val) { 
    autoCompleteArray.splice(i,1); 
    } 

的第一個參數.splice()是指數,而不是索引處的值。

要知道,當你拼接在指數i,該次迭代你不應該增加i

var i = 0; 
while (i < autoCompleteArray.length) { 
    if(autoCompleteArray[i][1] == val) { 
    autoCompleteArray.splice(i, 1); 
    continue; 
    } 
    ++i; 
} 

這是好的,如果只能有一個匹配,當然,在這種情況下,你也可以break;跳出循環。

+0

謝謝你傑克工作正常! – user1184100 2013-03-12 04:09:47

+0

而不是使用while循環和'繼續'爲什麼不只是減少'我'?看到我的答案。 – 2013-03-12 04:12:47

+0

@AaditMShah雖然這工作,並保存了幾行,我不會推薦以這種方式干涉循環不變。 – 2013-03-12 04:16:16

1

由於@Jack提到你需要傳遞一個索引(不是值)來拼接。我會重寫你的循環爲:

for (var i = 0; i < autoCompleteArray.length; i++) { 
    if (autoCompleteArray[i][1] === val) { 
     autoCompleteArray.splice(i--, 1); 
    } 
} 

這應該可以解決你的問題。請參閱此處的演示:http://jsfiddle.net/7PM94/

另請注意,您可以使用文字語法而不是推送元素來創建數組。您可以按如下方式定義autoCompleteArray

var autoCompleteArray = [ 
    ["1", "Java"], 
    ["2", "JavaScript"] 
]; 

希望有所幫助。

+0

謝謝你aadit – user1184100 2013-03-12 04:15:52