2014-01-11 381 views
1

我在JavaScript中有一個二維數組。如何在二維數組中搜索一維數組?

var arr = [['a', 'b'], ['c', 'd'], ['e', 'f'], ['g', 'h'], ['i', 'k']]; 

我要搜索的1-d陣列['a', 'b']或ARR 1-d陣列['b', 'a']。什麼將是最有效的方法? 將使用任何其他數據結構使其更高效。我添加,遍歷arr和搜索一維數組的方法。

回答

1

首先,您需要定義兩個數組的「平等」意味着什麼。由於somearray == otherarray是唯一真正的,如果兩個變量引用數組對象完全相同的情況下
(即a = [1,2]; b = [1,2]; c = a;允許a == ca != b

這是最好的一個函數來完成。例如,areArraysEqual(a,b)。在你的情況下,如果數組包含相同的元素,但不一定按相同的順序,此函數將需要返回true。就個人而言,我會建議每個陣列.sort(),然後逐個比較元素 - 排序後,a[0]應該等於b[0]a[1]等於b[1],依此類推。

既然你有你的數組比較函數,那麼迭代你的大數組是很簡單的事情,並且每個數組都檢查它是否等於你的單個數組。如果是,請退回您所在的位置並停止。

現在去寫一些代碼,並與一個特定的問題回來,如果您有任何:對

0

我不確定我是否理解,但您可以用shift()獲取第一個「元素」,然後您可以進一步操作它。

var arr = [['a', 'b'], ['c', 'd'], ['e', 'f'], ['g', 'h'], ['i', 'k']].shift(); 
arr; // arr is now ['a', 'b'] 

for(var i=0; i<arr.length;i++){ 
    if(arr[i] == "b"){ 
    //matched 'b' 
    } 
} 

從那裏你可以使用for循環搜索它。我希望我能正確理解你。

0

我與@Niet黑暗ABSOL 同意,我認爲不是壞主意通過比較一個元素之前一個用來比較長度,並且只用相同長度的數組對數組進行排序,而您發現它比排序所有一維數組更有效率。

function find(arr1d, arr2d) { 
    var result = []; 
    for (var i = 0; i < arr2d.length; ++i){ 
     if (arr2d[i].length == arr1d.length){ 
      var equal = true; 
      for (var j = 0; j < arr1d.length; ++j){ 
       if (arr2d[i].indexOf(arr1d[j]) == -1){ 
        equal = false; 
        break; 
       } 
      } 
      if (equal) 
       result.append(arr2d[i]); 
     } 
    } 
    return result; 
} 

這個解決方案沒有如此高效喜歡與排序,但如果你將整理和你不想改變你2-d數組你應該複製的數據,這是非常耗時,在這種情況下我的解決方案,我認爲比分類更有效率。

+1

應該對我的回答發表評論:p –

+0

我已經添加了代碼:p –

+0

在此實例中創建哈希而不是嵌套循環更有效嗎? – BenM