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

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

03.02.2021, 15:35. Показов 3472. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru