Сравните два массива, содержащих объекты, включая другие объекты, массивы и т. Д. - PullRequest
0 голосов
/ 20 декабря 2018

Посмотрите на эти примеры сравнительного кода массива:

// 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 голосов
/ 20 декабря 2018

Вы можете просто написать функцию, которая будет рекурсивно проверяться, пока не дойдет до примитивов.Например:

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.
0 голосов
/ 20 декабря 2018

подчеркивание путь:

_.isEqual(array1, array2) 
0 голосов
/ 20 декабря 2018

Вы должны JSON.stringify() массивы и сравнить их так:

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

Это работает, потому что преобразует массивы объектов в гораздо более простое сравнительное состояние (строки JSON).Это будет работать только в том случае, если массивы содержат свои свойства в том же порядке, что и в примере с OP.

0 голосов
/ 20 декабря 2018

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...