2014-01-11 556 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