比较两个包含对象的数组,包括其他对象,数组等

时间:2018-12-20 06:57:22

标签: javascript arrays node.js object

看看这些数组比较代码的例子:

// example-1
let array1 = ['a', 'b'];
let array2 = ['a', 'b'];
console.log(array1.equals(array2)); // returns true

// example-2
let array1 = ['a', 'b', 1];
let array2 = ['a', 'b', 1];
console.log(array1.equals(array2)); // returns true

// example-3
let array1 = ['a', 'b', {'a': 1, 'b': 2}];
let array2 = ['a', 'b', {'b': 2, 'a', 1}];
console.log(array1.equals(array2)); // returns false

我正在寻找一种比较其中包含对象的数组的方法,但是与嵌套对象中元素的顺序无关,就像上面的示例3中提到的那样。

4 个答案:

答案 0 :(得分:2)

您应该JSON.stringify()数组并像这样比较它们:

var arr1 = ['a', 'b', {'a': 1}];
var arr2 = ['a', 'b', {'a': 1}];
console.log(JSON.stringify(array1) == JSON.stringify(array2)); 

之所以起作用,是因为它将对象数组转换为一个更简单的比较状态(JSON字符串)。仅当数组包含其属性的顺序与OP示例中的顺序相同时,此方法才有效。

答案 1 :(得分:1)

您可以使用JSON.stringify()来获取JSON字符串并将其与===进行比较:

let array1 = ['a', 'b', {'a': 1}];
let array2 = ['a', 'b', {'a': 1}];
console.log(JSON.stringify(array1) === JSON.stringify(array2)); // returns true

答案 2 :(得分:1)

underscore方式:

_.isEqual(array1, array2) 

答案 3 :(得分:0)

可以只需编写一个函数即可进行递归检查,直到它归结为基元为止。例如:

function deepEqual(o1, o2){
    if (Array.isArray(o1)) {
        return Array.isArray(o2)
               && o1.length === o2.length
               && o1.every((item, idx) => deepEqual(item, o2[idx]))
    }
    if (typeof(o1) == 'object' && o1 != null){ // (typeof null == 'object)
        return typeof(o2) == 'object'
               && o2 != null
               && deepEqual(Object.entries(o1)
                  .sort((a,b) => a[0].localeCompare(b[0])),Object.entries(o2).sort((a,b) => a[0].localeCompare(b[0])))
    }
    return o1 === o2
}

//Object order doesn't matter
let ob1 = [1, 2, {a: "test", b:"hello"}, 4]
let ob2 = [1, 2, {b:"hello", a: "test", }, 4]

console.log(deepEqual(ob1, ob2))

ob1 = [1, 2, {a: "test", b:"hello"}, 4]
ob2 = [1, 2, {b:"hello", a: "non-test", }, 4]

console.log(deepEqual(ob1, ob2))

// array order matters:
ob1 = [2, 1, {a: "test", b:"hello"}, 4]
ob2 = [1, 2, {b:"hello", a: "test", }, 4]

console.log(deepEqual(ob1, ob2))

console.log(deepEqual("test", "test"))

console.log(deepEqual(null, {a:"test"}))

// etc.