2010-09-15 113 views
0

我的data[l][m]包含1,2,3,4,5 我試圖搜索一個特定的數字,在其中說'2'。有一個更好的方法嗎?搜索數組中的元素

for (var n = 0; n < data[l][m].length; n++) { 
    if(data[l][m][n] == num){ // num is equal to '2' 
     number = data[l][0]; 
     document.form.options[l-1] = new Option(number,number,true,true); 
    } 
} 

又有怎樣的:['id1',['a',[1,2,3,4,5]],['b',[3,4,5,6,7]]]
提前非常感謝。

回答

3

如果你已經包括了jQuery,使用$.inArray(),像這樣:

if($.inArray(num, data[l][m]) > -1) { 
    number = data[l][0]; 
    document.form.options[l-1] = new Option(number,number,true,true); 
} 

較短的香草JS版本是在陣列直接.indexOf(),但IE瀏覽器默認情況下不具備這一點。

+0

+1 for'inArray',但你沒有得到'number'。 – 2010-09-15 21:37:20

+0

@DGT:請注意,所有'inArray'正在做的是你所做的;但是因爲您已經在使用jQuery,所以不妨保存一些行和調試(並且作爲副產品,它會重用循環不變的'data [l] [m]',否則我建議您緩存到本地)。 – 2010-09-15 21:38:26

+0

@TJCrowder - 錯過了'號碼位,謝謝! – 2010-09-15 21:40:31

0

你可以使用indexOf,雖然它仍然具有相同的O(n)的複雜性,因爲你的for循環:

var pos = data[l][m].indexOf(num); 
if (pos !== -1) 
{ 
    // element was found 
    number = data[l][0]; 
    document.form.options[l-1] = new Option(number,number,true,true); 
} 

但是請注意,舊版本的IE瀏覽器不具備陣列的indexOf方法。

0

我沒有重大更改推薦,但確實有一些調整建議。首先是創建一個data[l]的臨時參考,以將閱讀複雜度降低1個級別。這是對編碼器的益處進行的整體變化。另一個是緩存你正在搜索的數組的長度,這有助於提高性能。如果您將for循環替換爲while循環,您也可以刪除比較操作。

var layer1 = data[l]; 
var n = layer1[m].length; 
while (n--) { 
    if (layer1[m][n] == num) { // num is equal to '2' 
     number = layer1[0]; 
     document.form.options[l - 1] = new Option(number, number, true, true); 
    } 
}