Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 15.11.2020
Сообщений: 11

Написать функцию для сравнения объектов.

03.02.2021, 15:35. Показов 3490. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В объектах я новичок, нужна помощь.
Нужно написать функцию compareСomputers, которая будет принимать 2 компьютера и возвращать true или false, в зависимости от того, одинаковые они или нет. Но номер у всех компьютеров разный.

Примеры:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
const computer1  = {
  serialNo: 1234,
  chipVer: 12,
  wheels: 2,
}
const computer2 = {
   wheels: 1,
  serialNo: 142,
  chipVer: 15,
}
 
compareRobots(computer1, computer2) === false

Пыталась решить так, но решение всегда возвращает false. Интересно узнать правильное решение, если возможно в таком формате и более компактном:

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
function compareComputers(computer1, computer2) {
 let k = [];
const ordered = {};
Object.keys(computer1).sort().forEach(function(key) {
  ordered[key] =computer1[key];
});
const ordered1 = {};
Object.keys(computer2).sort().forEach(function(key) {
  ordered1[key] = computer2[key];
});
let a = Object.values(ordered);
let b = Object.values(ordered1);
for (let i = 0; i < a.length; i++) {
if (a[i] == b[i] && ordered.chipVer !== ordered1.chipVer) {
  k.push(true);
}
else {
k.push(false);
}
}
let l;
for (let j = 0; j < k.length; j++) {
  if (k[j] == false) {
    l = false;
  }
}
return l;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.02.2021, 15:35
Ответы с готовыми решениями:

не срабатывают события к объектам созданым ajax пока не запустишь любое событие к другим стат объектам
Подскажите пожалуста не срабатывают события к объектам созданым ajax например такое $(function() { ...

Задачка с массивом и задачка с формулами Ньютона и Лагранжа
Прошу помочь решить две задачи

Задачка на файлы. интересная задачка с игрушками
Дан файл Assort, содержащий сведения об игрушках: указываются название игрушки, ее стоимость в рублях и возрастные границы (например,...

5
331 / 238 / 80
Регистрация: 15.11.2017
Сообщений: 453
Записей в блоге: 4
03.02.2021, 16:01
Лучший ответ Сообщение было отмечено Mikal как решение

Решение

JavaScript
1
2
3
4
5
6
7
8
9
10
11
function compareRobots(o1, o2)
{
    var arr = Object.keys(o1);
    
    for (var i = 0; i < arr.length; i++)
    {
        if ( arr[i] === 'serialNo' ) { continue; }
        if ( o1[arr[i]] !== o2[arr[i]] ) { return false; }
    }
    return true;
}
2
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
03.02.2021, 16:12
Тут два варианта проверки.
1) Просто сравнивать серийные номера и всё. Это просто.

2) Структурное равенство по всем свойствам объекта, кроме новых типов, появившихся в ES6 и более новых версиях JS.
Самый простой вариант структурного равенства - проверим, что объекты являются поверхностной копией один другого:
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
const computer1 = {
    serialNo: 1234,
    chipVer: 12,
    wheels: 2,
}
const computer2 = {
    wheels: 1,
    serialNo: 142,
    chipVer: 15,
}
 
const computer3 = {
    wheels: 1,
    serialNo: 142,
    chipVer: 15,
}
 
const computer4 = {
    wheels: 1,
    display: "Samsung",
    serialNo: 142,
    chipVer: 15,
}
 
console.log(compareRobots(computer1, computer2));
console.log(compareRobots(computer2, computer3));
console.log(compareRobots(computer3, computer4));
 
function compareRobots(obj1, obj2) {
    if (obj1.__proto__ !== obj2.__proto__) return false;
    let keys = new Set(Reflect.ownKeys(obj1).concat(Reflect.ownKeys(obj2)));
    for (let key of keys) {
        let d1 = Reflect.getOwnPropertyDescriptor(obj1, key);
        let d2 = Reflect.getOwnPropertyDescriptor(obj2, key);
        if (!d1 || !d2 || d1.get !== d2.get || d1.set !== d2.set || d1.value !== d2.value)
            return false;
    }
    return true;
}
2
331 / 238 / 80
Регистрация: 15.11.2017
Сообщений: 453
Записей в блоге: 4
03.02.2021, 16:14
amr-now, сдается мне, это перебор. Обычная школьная/студенческая задачка.

Серийник у всех разный, названия характеристик совпадают, а их значения могут отличаться.
2
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
03.02.2021, 18:56
DimaDima1985, при инвентаризации школьных компьютеров достаточно переписать серийные номера всего оборудования.
Пункта 1 - равенства серийных номеров достаточно.

А если мы как студенты хотим изучить поверхностное копирование объекта (что кстати программисту надо знать), то как раз мы видим.

Добавлено через 2 часа 30 минут
Цитата Сообщение от Mikal Посмотреть сообщение
решение всегда возвращает false
В строке 21 надо сразу присвоить true.
JavaScript
21
let l = true;
Но правило проверки странное. Почему ordered.chipVer обязательно должно быть не равно ordered1.chipVer ?

Условие задачи непонятное.
Если нам надо сравнить просто два компьютера по некоторым указанным признакам, то надо просто написать компаратор двух объектов.
Допустим, два компьютера одинаковые, если у них могут быть разный серийный номер и разный цвет. А мы например их сравниваем по объему оперативной и постоянной памяти и по марке процессора. Три сравниваемых параметра.

Добавлено через 7 минут
----
Вариант перебора любых указанных наименований свойств, если лениво писать специальный компаратор:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
function compareRobots(obj1, obj2, keys) {
    for (let key of keys) {
        let d1 = Reflect.getOwnPropertyDescriptor(obj1, key);
        let d2 = Reflect.getOwnPropertyDescriptor(obj2, key);
        if (!d1 || !d2 || d1.get !== d2.get || d1.set !== d2.set || d1.value !== d2.value)
            return false;
    }
    return true;
}
 
console.log(compareRobots(computer3, computer4, ["wheels", "serialNo"]));
выдаст true, если у них свойства "wheels", "serialNo" совпали. Всё остальное абсолютно безразлично.
1
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
04.02.2021, 09:35
Лучший ответ Сообщение было отмечено amr-now как решение

Решение

Цитата Сообщение от DimaDima1985 Посмотреть сообщение
Серийник у всех разный, названия характеристик совпадают, а их значения могут отличаться.
Судя по другой теме, набор свойств у компьютеров разный. Идём от обратного - не обращаем внимание на серийный номер и максимально упрощаем скрипт:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function compareRobots(obj1, obj2) {
    // Массив названий свойств первого объекта соединить с массивом названий свойств второго объекта
    let keys = Object.keys(obj1).concat(Object.keys(obj2));
    for (let key of keys) {
        // Серийный номер не сравнивать
        if (key === "serialNo") continue;
        // Взять дескриптор свойства как объект с описанием свойства. 
        // Если свойства нет, то вместо объекта будет undefined
        let d1 = Object.getOwnPropertyDescriptor(obj1, key);
        let d2 = Object.getOwnPropertyDescriptor(obj2, key);
        // Если свойство отсутствует в каком-либо объекте 
        // или значения свойства не равны
        if (!d1 || !d2 || d1.value !== d2.value)
            return false;
    }
    return true;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.02.2021, 09:35
Помогаю со студенческими работами здесь

Итерации по объектам
Можно как-либо проитерироваться по данному объекту? Т.е. мне нужно получить lparen, plus и minus. var operator = { lparen: {...

Обращение к объектам
Добрый вечер! Не пойму, как убедить Visual Studio Code воспринимать ${...} как обращению к объекту, а просто выводить всё строкой? В...

Обращение к объектам
Подскажите пожалуйста. Вот создал шаблон в PyQt, сгенерировал код питон импортирую его в основной файл. Как мне обратиться к объектам,...

Доступ к объектам
Доброго дня! Как получить доступ к элементам управления или другим объектам (итп) которые находятся на соседних страницах сайта (для...

Задача по Объектам
Вообщем дана задача: Объект: прямоугольник Методы: конструкторы Найти: периметр, площадь, диагональ


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru