11.01.2018, 22:35
|
Интересующийся
|
|
Регистрация: 12.01.2016
Сообщений: 19
|
|
Как проверить на равенство два массива?
Всем добрый вечер. Имеется два массива с одинаковыми объектами только переставленными местами:
Как можно проверить что имеется один и тот же набор данных в обоих массивах независимо от порядка, написал такой код, можно как-то упростить все это?:
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("не равно");
Последний раз редактировалось jtag, 11.01.2018 в 23:18.
|
|
12.01.2018, 01:12
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
сравнение массивов с обьектами
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));
|
|
12.01.2018, 11:33
|
Лаборант :-)
|
|
Регистрация: 08.11.2011
Сообщений: 806
|
|
а если превратить объекты в строки, отсортировать, потом сравнить?
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)) ? 'равно' : 'не равно');
|
|
12.01.2018, 11:40
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Тогда уж лучше сделать копии массивов с помощью slice, отсортировать эти копии и сравнить поэлементно. Будет экономнее по памяти, да и быстрее.
|
|
12.01.2018, 11:51
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
Pavel M.,
при условии одинакового порядка ключей
|
|
12.01.2018, 12:05
|
Лаборант :-)
|
|
Регистрация: 08.11.2011
Сообщений: 806
|
|
В задачке было :-)
Сообщение от jtag
|
Имеется два массива с одинаковыми объектами только переставленными местами
|
|
|
12.01.2018, 14:21
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,588
|
|
Alexandroppolus, отсортируй ка мне вышеприведённые массивы. Чисто интересу ради, хехе.
__________________
29375, 35
|
|
12.01.2018, 16:24
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Aetae, тебя функция сравнения объектов интересует? сравнивать оба поля. Если телефон или имя не повторяются, то достаточно сравнивать уникальные.
|
|
12.01.2018, 20:43
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,588
|
|
Alexandroppolus, сравнения произвольных элементов, если на то пошло, с поддержкой внутренней рекурсии.)
Понятно, что всё это при желании пишется, но вот просто "сделать копии массивов с помощью slice, отсортировать эти копии и сравнить поэлементно" - на самом деле в итоге выходит совсем не просто, ломаясь ещё на стадии сортировки.)
__________________
29375, 35
Последний раз редактировалось Aetae, 12.01.2018 в 20:47.
|
|
|
|