如何在node js中比较两个数组?

6ioyuze2  于 2023-01-30  发布在  Node.js
关注(0)|答案(8)|浏览(293)

我有两个数组,我如何比较这两个数组在一个镜头。

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

   if(arr1 == arr2){
      console.log(true);
    }else{
      console.log(false);
    }
ddarikpa

ddarikpa1#

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

边缘案例的旁注:
===对于此类任务通常被认为是稍微损坏的,因为NaN的行为出乎意料:

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

上面的代码实际上记录了false,因为NaN !== NaN。另外,===不能区分+0-0。为了涵盖这两种情况,你可以使用一个更强大的比较,称为“egal”或“is”,可以很容易地实现如下:

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

rdrgkggo2#

[ES6]
最佳答案是好&足够。
但是,当你只是想比较它的值是相同的,你必须排序它之前。这里没有必要排序代码。

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

而且..我觉得用“一些”代替“每一个”更好。
如果这些不一样,“一些”会让你提前退出。--很少早,但早;)

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

ubbxdtey3#

我会使用下划线来表示。

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

irtuqstp4#

最好的答案是好的,但我也会考虑使用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

如果你想让它也适用于NaN,并区分+0和-0,最好使用这个:

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
zte4gxcn

zte4gxcn5#

这是另一个不带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;
}
byqmnocz

byqmnocz6#

我想添加一些修改的代码所作的'Taihwan Hah',但无法留下评论(系统告诉我这样做)
下面是我的修改:

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

基本上,我必须检查but数组,因为我的数组不包含唯一的数字。

pbwdgjma

pbwdgjma7#

(虽然这个问题比v9.0.0老得多,但是)由于这个问题是关于Node的--从Node v9.0.0开始,您可以使用内置的“util”模块的isDeepStrictEqual(arr 1,arr 2)来比较数组(或对象,或任何相关的东西)

const util = require('util');
let arr1 = [1,2,3];
let arr2 = [1,2,3];
let arr3 = [1,3,2];
console.log(util.isDeepStrictEqual(arr1, arr2)) // true
console.log(util.isDeepStrictEqual(arr1, arr3)) // false

也适用于NaN
还有一个非严格的版本:https://nodejs.org/api/assert.html#assertdeepequalactual-expected-message

qyzbxkaa

qyzbxkaa8#

我想稍微改进一下staackuser2的答案:

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

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

相关问题