How to compare two arrays in node js?

前端 未结 7 1558
无人及你
无人及你 2021-01-12 07:42

I am having two arrays, how can i compare the two arrays at single shot.

   var arr1= [\"a\",\"b\",\"c\"];
   var arr2 = [\"a\",\"c\",\"d\"]

   if(arr1 == a         


        
相关标签:
7条回答
  • 2021-01-12 07:49

    Here's another one, without ES5 every:

    function arrEq(arr1, arr2) {
      for (var i = 0; i < arr1.length; i++)
        if (arr1[i] != arr2[i])
          return false;
      return i == arr2.length;
    }
    
    0 讨论(0)
  • 2021-01-12 07:52

    [ES6]

    Top answer is good & enough.

    But when you just want to compare its values are same you have to sort it before. here's no need sort code.

    if(arr1.length == arr2.length && arr1.every((v) => arr2.indexOf(v) >= 0)) {
        console.log(true);
    } else {
        console.log(false);
    }
    

    And.. I think using a 'some' instead of 'every' is better.

    If those are not same, 'some' gives you a early exit. - very little early but early ;)

    if(arr1.length == arr2.length && !arr1.some((v) => arr2.indexOf(v) < 0)) {
        console.log(true);
    } else {
        console.log(false);
    }
    
    0 讨论(0)
  • 2021-01-12 07:54

    I would like to improve the answer from staackuser2 a little bit:

    var same = (arr1.length === arr2.length) && (_.difference(arr1, arr2).length === 0)
    

    or

    var same = (_.difference(arr1, arr2).length === 0) && (_.difference(arr2, arr1).length === 0)
    
    0 讨论(0)
  • 2021-01-12 07:59

    The top answer is good, but I would also consider using Array.prototype:

    Array.prototype.equals = function (arr) {
        return this.length == arr.length && this.every((u, i) => u === arr[i]);
    }
    
    console.log([1,2,3].equals([1,2,3])); // true
    console.log([1,2,3].equals([1,3,3])); // false
    // BUT!
    console.log(["a",NaN,"b"].equals(["a",NaN,"b"])); // false, because NaN !== NaN
    

    If you want it to work for NaNs too and distinguish +0 and -0, better use this:

    Array.prototype.equals = function (arr) {
        function is(a, b) { // taken from the top answer
            return a === b && (a !== 0 || 1 / a === 1 / b) // false for +0 vs -0
                || a !== a && b !== b; // true for NaN vs NaN
        }
        return this.length == arr.length && this.every((u, i) => is(u, arr[i]));
    }
    
    console.log(["a",NaN,"b"].equals(["a",NaN,"b"])); // true
    
    0 讨论(0)
  • 2021-01-12 08:07

    I wanted to add some modification of the code made by 'Taihwan Hah' but could not leave a comment (the system told me so)

    So here is my modifs:

    function ArrayEquals(arr1,arr2){
        return arr1.length === arr2.length && !arr1.some((v) => arr2.indexOf(v) < 0) && !arr2.some((v) => arr1.indexOf(v) < 0);
    }
    

    basically, I had to check for but array because my arrays do not contains unique numbers.

    0 讨论(0)
  • 2021-01-12 08:11
    var arr1 = ["a","b","c"];
    var arr2 = ["a","c","d"];
    
    if (arr1.length == arr2.length
        && arr1.every(function(u, i) {
            return u === arr2[i];
        })
    ) {
       console.log(true);
    } else {
       console.log(false);
    }
    

    Side note for edge cases:

    === is often considered slightly broken for this kind of task because NaN behaves unexpectedly:

    var arr1 = ["a",NaN,"b"];
    var arr2 = ["a",NaN,"b"];
    
    if (arr1.length == arr2.length
        && arr1.every(function(u, i) {
            return u === arr2[i];
        })
    ) {
       console.log(true);
    } else {
       console.log(false);
    }
    

    The code above actually logs false because NaN !== NaN. In addition, === can't distinguish +0 from -0. To cover both of these cases, you could use a stronger comparison known as "egal" or "is", which can easily be implemented like so:

    function is(a, b) {
        return a === b && (a !== 0 || 1 / a === 1 / b) // false for +0 vs -0
            || a !== a && b !== b; // true for NaN vs NaN
    }
    
    var arr1 = ["a",NaN,"b"];
    var arr2 = ["a",NaN,"b"];
    
    if (arr1.length == arr2.length
        && arr1.every(function(u, i) {
            // Use "is" instead of "==="
            return is(u, arr2[i]);
        })
    ) {
       console.log(true);
    } else {
       console.log(false);
    }
    
    0 讨论(0)
提交回复
热议问题