0 / 0 / 0
Регистрация: 13.12.2017
Сообщений: 32

Сравнивание массивов.Как можно сделать проще ?

26.03.2018, 14:04. Показов 645. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Реализовал метод richEquals,который принимает два параметра array1 {Array}
array2 {Array}.И возвращает булен равны ли массивы array1 и array2 между собой. При этом содержимое массива может быть разных типов, а сам массив в качестве элемента может быть другой массив либо объект. При проверке равенства объектов и массивов необходимо проверять значения.делать проверку по ссылке запрещено.

Пример массива:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var array1 = [
   null,
   "Marvel",
   "2.0.17",
   {
       name: "Hulk",
       color: "green",
       age: 31,
       abilities: ["crash", "smash"]
   },
   {
       name: "Iron Man",
       age: 35,
       stillAlive: true
   },
   ["Captain America", "Thor", "Captain Marvel"]
];
Сделал таким образом ,все работает.как можно сделать проще и красивей?
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
 
function compareObjects(obj1, obj2) {
    if ((typeof obj1 === "undefined" ? "undefined" : _typeof(obj1)) == (typeof obj2 === "undefined" ? "undefined" : _typeof(obj2))) {
        if (obj1 instanceof Object) {
            if (Object.keys(obj1).length == Object.keys(obj2).length) {
                for (var key in obj1) {
                    if (!(key in obj2) || !compareObjects(obj1[key], obj2[key])) {
                        return false;
                    }
                }
                return true;
            }
        } else {
            return obj1 == obj2;
        }
    }
    return false;
}
 
function richEquals(arr1, arr2) {
    if (arr1.length == arr2.length) {
        var pairs = arr1.map(function (item, index) {
            return [item, arr2[index]];
        });
        var _iteratorNormalCompletion = true;
        var _didIteratorError = false;
        var _iteratorError = undefined;
 
        try {
            for (var _iterator = pairs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
                var item = _step.value;
 
                if (!compareObjects(item[0], item[1])) {
                    return false;
                }
            }
        } catch (err) {
            _didIteratorError = true;
            _iteratorError = err;
        } finally {
            try {
                if (!_iteratorNormalCompletion && _iterator.return) {
                    _iterator.return();
                }
            } finally {
                if (_didIteratorError) {
                    throw _iteratorError;
                }
            }
        }
 
        return true;
    }
    return false;
}
 
var result = richEquals([null, "Marvel", "2.0.17", {
    name: "Hulk",
    color: "green",
    age: 31,
    abilities: ["crash", "smash"]
}, {
    name: "Iron Man",
    age: 35,
    stillAlive: true
}, ["Captain America", "Thor", "Captain Marvel"]], [null, "Marvel", "2.0.17", {
    name: "Hulk",
    color: "green",
    age: 31,
    abilities: ["crash", "smash"]
}, {
    name: "Iron Man",
    age: 35,
    stillAlive: true
}, ["Captain America", "Thor", "Captain Marvel"]]);
 
console.log(result);
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.03.2018, 14:04
Ответы с готовыми решениями:

можно сделать данную программу проще?как можно примитивней
Var F,x: real; Function ArcCos(z:Real):Real; begin if Round(z*10000000)=10000000 then ArcCos:=0 else if...

Страуструп. Сортировка трех чисел .Как сделать проще код без циклов и массивов?
Напишите программу. предлагающую пользователю ввести три целых числа, а затем выводит их в порядке возрастания, разделяя запятыми ....

Как можно сделать данный кусок кода меньше и проще?
Задние: Заменить все элементы с четными номерами на значение второго положительного элемента массива. void change() //замена элементов...

3
90 / 90 / 48
Регистрация: 07.12.2011
Сообщений: 215
26.03.2018, 14:51
Такого рода функции уже написаны до вас. Например функция isEqual, которая делает как раз то, что вам нужно есть в библиотеках underscore или lodash. Если прям хотите свой код, то можете скачать библиотеку и посмотреть как они там это сделали.
1
0 / 0 / 0
Регистрация: 13.12.2017
Сообщений: 32
26.03.2018, 15:05  [ТС]
Wlkспасибо . понятно,что не хочу изобретать велосипед .. просто хотелось самому попрактиковаться .Скажите пожалуйста, правильно я имплементировал метод? или все же лучше воспользоваться isEqual?
0
90 / 90 / 48
Регистрация: 07.12.2011
Сообщений: 215
26.03.2018, 19:48
Попрактиковаться пожалуйста, это ок.
А юзать на практике в подавляющем большинстве случаев лучше библиотечные. Они оттестированы под разные сценарии, которые не факт что вы учли.

Ваш код не дебажил, конечно же. По структуре что-то похожее на правду. Использована рекурсия.
Кроме того ваш подход ограничен только массивами.

Прогнал по некоторым частным сценариям.
Несовпадения:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
console.log(_.isEqual([NaN], [NaN]));   // true
console.log(richEquals([NaN], [NaN]));  // false
 
 
var a = {};
a.b = a;
var b = {};
b.b = a;
 
console.log(_.isEqual([a], [b]));   // true
console.log(richEquals([a], [b]));  // Uncaught RangeError: Maximum call stack size exceeded
 
console.log(_.isEqual([{ a: () => {} }], [{ a:() => {} }]));   // false
console.log(richEquals([{ a: () => {} }], [{ a:() => {} }]));  // true
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.03.2018, 19:48
Помогаю со студенческими работами здесь

Оператор switch, можно ли сделать код проще?
Дана задача посчитать гласные в тексте введенном с клавиатуры, вопрос ниже... #include <iostream> #include <string> ...

можно ли сделать программу проще? стандартной склейкой слов
Задание: соединить слова. которые пользователь введет в консоль. можно как нибудь с помощью стандартных и простых методов это сделать? ...

Как сделать перемещение нескольких файлов с заменой? И как это сделать проще?
Как сделать перемещение нескольких файлов с заменой? Например я ввожу в текстбокс название файлов, потом эти файлы переношу в...

Как можно проще!
Как можно проще! У меня задача: Написать прогу, которая как можно проще будет конектится (через интернет) в базу (MySql) и читать ее....

можно написать ее как то проще ?
#include <stdio.h> #include <locale.h> #include <string> #include <conio.h> int main() { setlocale(LC_CTYPE, "rus"); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru