这些数组之间的差异以及如何比较它们?

时间:2011-10-08 12:26:24

标签: javascript jquery arrays compare

我有两个数组,一个看起来像:

["ssewweewewzad0xsis", "sasasaasasaas", "ddwdwd", "ffdfdfdffdfdf", "rffrfrfrfrfrrf", "rffrfrfrffrfrfrfbyzad0xsis
", "dsdssddssd", "ssdsddssd"]

另一个看起来像:

[
Array[8]
0: "ssdsddssd"
1: "dsdssddssd"
2: "rffrfrfrffrfrfrfbyzad0xsis↵"
3: "rffrfrfrfrfrrf"
4: "ffdfdfdffdfdf"
5: "ddwdwd"
6: "sasasaasasaas"
7: "ssewweewewzad0xsis"
length: 8
__proto__: Array[0]

(取自Chrome中的开发者控制台)

它们之间有什么区别?我如何检查它们是否相同?

第一个来自解析的JSON,第二个来自var array = new Array();,其值通过array.push()添加。

4 个答案:

答案 0 :(得分:1)

首先检查两个阵列的长度是否相同。然后迭代两者并检查所有相应的值是否严格相等(===)。

答案 1 :(得分:1)

从屏幕截图中看来,这是一个数组内的数组。

要获取嵌套数组,可以使用theArray[0]

例如:

var arr  = [1, 2, 3], // shows up as [1, 2, 3]
    arr2 = [arr];     // shows up as [ Array[3] ] which you can expand
                      // with the arrow

然后:

arr2[0] === arr;

要进行比较,它取决于数组是否引用相同的东西。

如果是,请使用arr2[0] === arr

否则,您可以使用互联网上提供的算法之一。在Chrome中,也可以这样做:

var a = [1, 2, 3],
    b = [1, 2, 3];

a === b;          // false
a <= b && a >= b; // true

答案 2 :(得分:1)

您可以使用join来比较字符串,而不是循环。

function checkArrays( arrA, arrB ){

    //check if lengths are different
    if(arrA.length !== arrB.length) return false;


    //slice so we do not effect the orginal
    //sort makes sure they are in order
    //join makes it a string so we can do a string compare
    var cA = arrA.slice().sort().join(""); 
    var cB = arrB.slice().sort().join("");

    return cA===cB;

}

var a = [1,2,3,4,5];
var b = [5,4,3,2,1];
var c = [1,2,3,4];
var d = [1,2,3,4,6];
var e = ["1","2","3","4","5"];  //will return true

console.log( checkArrays(a,b) );  //true
console.log( checkArrays(a,c) );  //false
console.log( checkArrays(a,d) );  //false
console.log( checkArrays(a,e) );  //true

唯一的问题是,如果您关心上次比较测试的类型。 如果你关心类型,你将不得不循环。

function checkArrays( arrA, arrB ){

    //check if lengths are different
    if(arrA.length !== arrB.length) return false;

    //slice so we do not effect the orginal
    //sort makes sure they are in order
    var cA = arrA.slice().sort(); 
    var cB = arrB.slice().sort();

    for(var i=0;i<cA.length;i++){
         if(cA[i]!==cB[i]) return false;
    }

    return true;

}

var a = [1,2,3,4,5];
var b = [5,4,3,2,1];
var c = [1,2,3,4];
var d = [1,2,3,4,6];
var e = ["1","2","3","4","5"];

console.log( checkArrays(a,b) );  //true
console.log( checkArrays(a,c) );  //false
console.log( checkArrays(a,d) );  //false
console.log( checkArrays(a,e) );  //false

答案 3 :(得分:1)

我解释你的问题实际上是在问“这两个结构实际上是等同的”而不是问更通用的问题“如何编写代码来比较两个数组

简单的答案是(除了不正确的两级嵌套之外)两个数组结构上相同。但是出于某种原因,其中一个阵列是颠倒过来的。

你是如何复制它们的?最简单的方法是:

var copy = [];
for (var i = 0; i < orig.length; ++i) {
    copy.push(orig[i]);
}

或甚至更为平凡:

var copy = [].concat(orig);

如果您使用以下(不正确的)代码:

for (var i in orig) {
    copy.push(orig[i]);
}

然后无法保证枚举顺序,这可能就是你最终得到反转数组的原因。