2011-06-05 175 views
1

我有一小段代码,其中数组填充数组。最后,我有这个阵列n成员数组。这些子数组总是具有相同数量的相同类型(数字)的成员(2)。我需要知道这些子数组是否完全相同(相同的成员,相同的位置)。这总是返回false:比较数组

[2, 0] === [2, 0] 

关闭我的头顶,我可以想到两种方法来比较。

  • 循环,其中我测试(部件[I] [0] ===构件第[i + 1] [0] & &构件[I] [1] ===构件第[i + 1] [1])。
  • 与此测试相同的循环:(member [i] .toString()=== member [i + 1] .toString())。

我想我正在采取这种错误的方式。你怎么看?

回答

2

对于我自己的想法,我认为使用循环来比较两个数组是正确的。

var isTheSame = true; 
for (var i in array1) { 
    if (array1[i] !== array2[i]) isTheSame = false; 
} 

上述工作循环,它将返回虚假或者任何从不同类型的元件(3等号===),或值,或长度或偶数密钥的。

你的第二个建议不应该像第一个那样完全一样,因为你已经把它转换成一个字符串了,如果array1 [0] =“true”和array2 [0] = true会发生什么?它会返回true,因为现在它们都是字符串,但是您需要准确的比较吗?

这是我自己的想法,我希望它可以帮助某种方式。

问候, [X]

+1

+1你的观点关于“true”== true在toString()是好的之后 – 2011-06-05 05:45:32

+1

是的,那是关于我现在所拥有的,它的工作原理。我想知道是否有另一种方式。谢谢! :) – 2011-06-05 06:15:02

2
a=[2,0]; b=[2,0]; a.toString() == b.toString(); 

也许不是最有效的,但它似乎工作,我更短,更具可读性的解决方案的坚定支持者。

请注意,xx3004关于转换为字符串时丢失的类型数据的观点是值得思考的,除非您确实知道您的数组将由相同的数据类型组成。

+0

我甚至没有注意到你已经在你的问题中发布了这个解决方案直到现在:^( – 2011-06-05 05:43:47

+0

+1:同样如果它的int和用逗号分隔'array1.join()=== array2.join( );' – naveen 2011-06-05 05:47:49

+0

Ooooh,_join_,我要玩那个。 – 2011-06-05 06:14:22

1

对于两个一维数组是否完全相同,可以使用下面的说法得到真或假。它需要递归,如果你添加尺寸,但这就足够了你所问的,我想。

function testArray(a, b) { 
    var aLen = a.length; 
    var bLen = b.length; 

    if (aLen === bLen) { // check for identical length first 
     for (var i = 0; i < aLen; i++) { 
      if (a[i] !== b[i]) { 
       return false; // members don't match 
      } 
     } 
     return true; // all members matched 
    } 
    return false; // not same length 
} 

http://jsfiddle.net/pgkUr/

+1

+1伟大的思想? :P – alex 2011-06-05 05:46:41

1

这是我想出了...

var arrayCompare = function(a, b) { 

    var aLength = a.length, 
     bLength = b.length; 

    if (aLength != bLength) { 
     return false; 
    } 

    for (var i = 0; i < aLength; i++) { 
     if (a[i] !== b[i]) { 
     return false; 
     } 
    } 

    return true; 

} 
+0

这看起来很熟悉。 ;) – brymck 2011-06-05 05:47:30

+0

要玩那个,谢谢! :) – 2011-06-05 06:17:08

1

这里有一个简单的方法来两个数组比较,建立在你的toString想法(甚至多维的人将工作):

function compareArrays(a1, a2) { 
    return JSON.stringify(a1) == JSON.stringify(a2); 
} 

compareArrays([[2,3],[7,4],[3,3]], [[2,3],[7,4],[3,3]]) // true 
compareArrays([[2,3],[7,4],[3,3]], [[7,4],[2,3],[3,3]]) // false 
0

如果您愿意使用Underscore,这是一个很棒的工具(我认为它比jQuery好,甚至更高),你可以简化这些代码。在比较数组时,你不需要嵌套:我会事先把它们弄平。然后,它只是一个循环:

function cmpArrays(arr1, arr2){ 
    var flat = _.zip(_.flatten(arr1), _.flatten(arr2)); 

    for(var elem in flat){ 
     if(flat[elem][0] !== flat[elem][1]){ 
      return false; 
     } 
    } 

    return true; 
} 

推广这一与任意数量的阵列的工作应该是很简单的为好。