【问题标题】:Differences between these arrays and how can I compare them?这些数组之间的差异以及如何比较它们?
【发布时间】:2011-10-08 12:26:23
【问题描述】:

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

["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() 添加。

【问题讨论】:

  • 第二个是数组中的数组吗?它是否显示为[ Array[8] ]
  • 它在开发者工具中显示为p.fr.am/AXRu,但我不久前开始学习jQuery,我不知道它到底是什么
  • 请发布从一个复制到另一个的代码。

标签: javascript jquery arrays compare


【解决方案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】:

    首先检查两个数组的长度是否相同。然后遍历两者并检查所有对应的值是否严格相等(===)。

    【讨论】:

    • @Pointy 一个更基本的问题是为什么第二个实例被反转了?
    【解决方案3】:

    您可以使用 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
    

    【讨论】:

      【解决方案4】:

      我认为您的问题实际上是在问“这两个结构实际上是否等效”,而不是问更通用的问题“我如何编写代码来比较两个数组” .

      简单的答案是(除了不正确的两级嵌套可能例外)这两个数组在结构上是相同的。但是由于某种原因,其中一个数组被颠倒了。

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

      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]);
      }
      

      那么无法保证枚举顺序,这可能就是您最终得到一个反转数组的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-07
        • 2020-02-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多