Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 13.12.2017
Сообщений: 32
1

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

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

Author24 — интернет-сервис помощи студентам
Реализовал метод 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2018, 14:04
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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
26.03.2018, 19:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2018, 19:48
Помогаю со студенческими работами здесь

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

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

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

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

нужно решить как можно проще
в текстовом файле подсчитать количество строк, которые начинаются и оканчиваются одной и той же...

Можно ли это написать как то проще
#include <cstdlib> #include <iostream> #include <stdlib.h> #include <math.h> using namespace...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru