Как проверить на равенство два массива?
Всем добрый вечер. Имеется два массива с одинаковыми объектами только переставленными местами:
Как можно проверить что имеется один и тот же набор данных в обоих массивах независимо от порядка, написал такой код, можно как-то упростить все это?: 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,
при условии что обьекты не содержат обьектов "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)); |
а если превратить объекты в строки, отсортировать, потом сравнить?
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)) ? 'равно' : 'не равно'); |
Тогда уж лучше сделать копии массивов с помощью slice, отсортировать эти копии и сравнить поэлементно. Будет экономнее по памяти, да и быстрее.
|
Pavel M.,
при условии одинакового порядка ключей |
В задачке было :-)
Цитата:
|
Alexandroppolus, отсортируй ка мне вышеприведённые массивы. Чисто интересу ради, хехе.
|
Aetae, тебя функция сравнения объектов интересует? сравнивать оба поля. Если телефон или имя не повторяются, то достаточно сравнивать уникальные.
|
Alexandroppolus, сравнения произвольных элементов, если на то пошло, с поддержкой внутренней рекурсии.)
Понятно, что всё это при желании пишется, но вот просто "сделать копии массивов с помощью slice, отсортировать эти копии и сравнить поэлементно" - на самом деле в итоге выходит совсем не просто, ломаясь ещё на стадии сортировки.) |
Часовой пояс GMT +3, время: 11:48. |