Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как проверить на равенство два массива? (https://javascript.ru/forum/misc/72148-kak-proverit-na-ravenstvo-dva-massiva.html)

jtag 11.01.2018 22:35

Как проверить на равенство два массива?
 
Всем добрый вечер. Имеется два массива с одинаковыми объектами только переставленными местами:

Как можно проверить что имеется один и тот же набор данных в обоих массивах независимо от порядка, написал такой код, можно как-то упростить все это?:

let arr1 = [{owner: "human1", phone: 111}, {owner: "human2", phone: 222}, {owner: "human3", phone: 333}];
let arr2 = [{owner: "human3", phone: 333}, {owner: "human1", phone: 111}, {owner: "human2", phone: 222}];

for (let i = 0; i < arr1.length; i++) {    
    for (let j = 0; j < arr2.length; j++) {
        if (arr1[i].phone === arr2[j].phone) {          //если встречаются равные элементы, добавляю свойство done='ok'
            arr1[i].done = "ok";
            arr2[j].done = "ok";
        }
    }
}
let flag = false;
for (let i = 0; i < arr1.length; i++) {                                  //если у всех элементов из двух масивов есть свойство done='ok', то массивы равны
    if (arr1[i].done === "ok" && arr2[i].done === "ok") {
        flag = true;
    } else {
        flag = false;
        break;
    }
}

flag ? console.log("равно") : console.log("не равно");

рони 12.01.2018 01:12

сравнение массивов с обьектами
 
jtag,
при условии что обьекты не содержат обьектов
"use strict"
let arr1 = [{owner: "human1", phone: 111}, {owner: "human2", phone: 222}, {owner: "human3", phone: 333}];
let arr2 = [{owner: "human3", phone: 333}, {owner: "human1", phone: 111}, {owner: "human2", phone: 222}];
let compare = (a,b) => Object.keys(a).length == Object.keys(b).length && Object.keys(a).every(e => b[e] === a[e]);
let verify = (a,b) => a.length == b.length && (b = b.slice(0),a.filter(e => b.some((k,i) => (compare(k,e) && b.splice(i,1)))),!b.length);
console.log(verify(arr1, arr2));

Pavel M. 12.01.2018 11:33

а если превратить объекты в строки, отсортировать, потом сравнить?

let arr1 = [{owner: "human1", phone: 111}, {owner: "human2", phone: 222}, {owner: "human3", phone: 333}];
let arr2 = [{owner: "human3", phone: 333}, {owner: "human1", phone: 111}, {owner: "human2", phone: 222}];

arr1 = arr1.map(obj => JSON.stringify(obj)).sort();
arr2 = arr2.map(obj => JSON.stringify(obj)).sort();

alert ((JSON.stringify(arr1) === JSON.stringify(arr2)) ? 'равно' : 'не равно');

Alexandroppolus 12.01.2018 11:40

Тогда уж лучше сделать копии массивов с помощью slice, отсортировать эти копии и сравнить поэлементно. Будет экономнее по памяти, да и быстрее.

рони 12.01.2018 11:51

Pavel M.,
при условии одинакового порядка ключей

Pavel M. 12.01.2018 12:05

В задачке было :-)
Цитата:

Сообщение от jtag
Имеется два массива с одинаковыми объектами только переставленными местами


Aetae 12.01.2018 14:21

Alexandroppolus, отсортируй ка мне вышеприведённые массивы. Чисто интересу ради, хехе.

Alexandroppolus 12.01.2018 16:24

Aetae, тебя функция сравнения объектов интересует? сравнивать оба поля. Если телефон или имя не повторяются, то достаточно сравнивать уникальные.

Aetae 12.01.2018 20:43

Alexandroppolus, сравнения произвольных элементов, если на то пошло, с поддержкой внутренней рекурсии.)
Понятно, что всё это при желании пишется, но вот просто "сделать копии массивов с помощью slice, отсортировать эти копии и сравнить поэлементно" - на самом деле в итоге выходит совсем не просто, ломаясь ещё на стадии сортировки.)


Часовой пояс GMT +3, время: 11:48.