2009-12-08 92 views
0

我相信這很簡單,我曾經有一個檢查數組內容的函數。現在我想修改它來檢查一個二維數組。javascript - loop multidimestional array

function ChkArray(Str, Val){ 

for (var i=0;i<Str.length;i++){ 
     if (Str[i] == Val) {return i;} 
    } 
return -1; 
} 

我的新嘗試:

function ChkArray2(Str, Val){ 

for (var i=0;i<Str.length;i++){ 
     for (var ii=0;ii<Str[ii].length;ii++){ 
      if (Str[i][ii] == Val) {return i;} 
     } 
    } 
return -1; 
} 
+0

我意識到我有另一個問題,我的二維數組的鍵實際上並不是數字。是否有像PHP一樣的'foreach'風格循環? – Mark 2009-12-08 13:51:50

回答

-1

我建議使用JavaScript foreach。

function ChkArray2(Str, Val){  
    for (var i in Str){ 
     for (var ii in Str[i]){ 
      if (Str[i][ii] == Val){ 
       return i; 
      } 
     } 
    } 
    return -1; 
} 
+3

這是一個非常糟糕的主意。你不應該使用'for .. in'來迭代數組,因爲它將包含數組的所有屬性,它將(至少)包含「length」。 – nickf 2009-12-08 14:00:56

+0

@nickf你說得對,雖然對於這個特定的問題,這是一個可以接受的解決方案。 – Li0liQ 2009-12-08 14:06:00

+1

for ... in Array Array是一個常見的錯誤。除了屬性問題,您也不一定會按數字順序獲取項目。 – bobince 2009-12-08 14:08:36

2

關閉,在你的內循環,要檢查當前項目的長度外循環:

function ChkArray2(Str, Val){ 

    for (var i=0;i<Str.length;i++){ 
     for (var ii=0;ii<Str[i].length;ii++){ 
      if (Str[i][ii] == Val) {return i;} 
     } 
    } 
    return -1; 
} 

應工作

+0

謝謝,它確實...除了我意識到我還有一個問題,我的二維數組的鍵實際上並不是數字。是否有像PHP一樣的'foreach'風格循環? – Mark 2009-12-08 13:52:23

+0

是的:for ... in循環。 http://stackoverflow.com/questions/684672/loop-through-json-object – 2009-12-08 13:56:25

+0

是的,它應該只用於對象,而不是數組。 – nickf 2009-12-08 14:06:12

1

如果您問的是更好的方法來解決這個問題,我可能會考慮編寫一個函數,它可以處理數組中的任意維數。在你的例子中,返回值是頂層數組的索引,但爲了使其通用,你必須將完整的「路徑」返回到找到的元素,並讓調用代碼決定它想要的信息:

function multiFind(arr, val) { // please don't name an array "str"! 
    for (var i = 0, l = arr.length; i < l; ++i) { 
     if (arr[i] === val) { 
      return [i]; 
     } else if (is_array(arr[i])) { 
      var ret = multiFind(arr[i], val); 
      if (ret !== false) { 
       ret.unshift(i); 
       return ret; 
      } 

     } 
    } 
    return false; 
} 

// this function by Doug Crockford 
var is_array = function (value) { 
    return value && 
     typeof value === 'object' && 
     typeof value.length === 'number' && 
     typeof value.splice === 'function' && 
     !(value.propertyIsEnumerable('length')); 
}; 

var inp = ["a","b",["c", ["d", "e", ["f", "g"], "h"]]]; 

multiFind(inp, "a"); // [0] 
multiFind(inp, "b"); // [1] 
multiFind(inp, "c"); // [2, 0] 
multiFind(inp, "f"); // [2, 1, 2, 0] 
multiFind(inp, "h"); // [2, 1, 3] 
multiFind(inp, "x"); // false