Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.01.2018, 22:35
Интересующийся
Отправить личное сообщение для jtag Посмотреть профиль Найти все сообщения от jtag
 
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 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));
Ответить с цитированием
  #3 (permalink)  
Старый 12.01.2018, 11:33
Лаборант :-)
Отправить личное сообщение для Pavel M. Посмотреть профиль Найти все сообщения от Pavel M.
 
Регистрация: 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)) ? 'равно' : 'не равно');
Ответить с цитированием
  #4 (permalink)  
Старый 12.01.2018, 11:40
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Тогда уж лучше сделать копии массивов с помощью slice, отсортировать эти копии и сравнить поэлементно. Будет экономнее по памяти, да и быстрее.
Ответить с цитированием
  #5 (permalink)  
Старый 12.01.2018, 11:51
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

Pavel M.,
при условии одинакового порядка ключей
Ответить с цитированием
  #6 (permalink)  
Старый 12.01.2018, 12:05
Лаборант :-)
Отправить личное сообщение для Pavel M. Посмотреть профиль Найти все сообщения от Pavel M.
 
Регистрация: 08.11.2011
Сообщений: 806

В задачке было :-)
Сообщение от jtag
Имеется два массива с одинаковыми объектами только переставленными местами
Ответить с цитированием
  #7 (permalink)  
Старый 12.01.2018, 14:21
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,588

Alexandroppolus, отсортируй ка мне вышеприведённые массивы. Чисто интересу ради, хехе.
__________________
29375, 35
Ответить с цитированием
  #8 (permalink)  
Старый 12.01.2018, 16:24
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Aetae, тебя функция сравнения объектов интересует? сравнивать оба поля. Если телефон или имя не повторяются, то достаточно сравнивать уникальные.
Ответить с цитированием
  #9 (permalink)  
Старый 12.01.2018, 20:43
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,588

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

Последний раз редактировалось Aetae, 12.01.2018 в 20:47.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как проверить на этом-ли хостинге стоит сайт из определнного домена? Gamestop Серверные языки и технологии 3 05.11.2012 06:51
Как быстро проверить есть ли в массиве нужная строка? Почемучкин Общие вопросы Javascript 15 17.08.2012 20:19
Как проверить корректность поля e-mail? daniilino Общие вопросы Javascript 9 15.05.2012 16:50
Как два раза вставить таймер alexvost Общие вопросы Javascript 2 08.02.2011 02:28
как проверить, есть ли переменная Аскар Общие вопросы Javascript 3 04.01.2010 17:09