powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Сложные структуры в качестве ключа в set
25 сообщений из 82, страница 1 из 4
Сложные структуры в качестве ключа в set
    #40087433
Помогите нубу в JS. Использую Node.js

Код: javascript
1.
2.
3.
4.
5.
let set = new Set();

set.add( { p1: 'aaa', p2: 'bbb' } )

console.log( set.has( { p1: 'aaa', p2: 'bbb' } ) )



Логично выдаёт false. Надо, чтобы выдавало true. На С++ я понимаю, что надо реализовать класс и переопределить у него оператор сравнения, чтобы сравнивал по значению свойств. Как это сделать на JavaScript ? Быстрое гугление не помогло. А читать с нуля учебник на тысячу страниц долго.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087437
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать спросить в профильной ветке

Модератор: Тема перенесена из форума "Java".
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087467
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ведущий профессионал
Логично выдаёт false. Надо, чтобы выдавало true. На С++ я понимаю, что надо реализовать класс и переопределить у него оператор сравнения, чтобы сравнивал по значению свойств. Как это сделать на JavaScript ?

Я х/з что там за Set...

Но для сравнения объектов есть несколько путей. Например самый простой

Код: javascript
1.
2.
3.
4.
5.
6.
7.
const o1 = {a: 1, b: 2}
const o2 = {a: 1, b: 2}

// это разные объекты
alert(o1 === o2)
// но они "равны"
alert(JSON.stringify(o1) === JSON.stringify(o2))
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087469
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ведущий профессионал , вот нашел тебе статейку на тему "сравнения объектов"...
https://codeguru.info/kak-sravnit-obekty-v-javascript/

Там есть разные варианты с примерами.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087470
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa
Я х/з что там за Set...

Почитал про этот Set...
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Set

Так ты хочешь как-то сам переделать этому Set сравнение с объектами?
Тогда зачем такой Set нужен?
Если я правильно понял, его и делали как раз таким чтобы он умел правильно сравнивать если у него такой элемент или нет.

Может тебе просто в тот Set не так засовывать свои объекты? Или вовсе не засовывать, если "равные" не должны быть равными...
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087670
krvsa
krvsa
Я х/з что там за Set...

Почитал про этот Set...
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Set

Так ты хочешь как-то сам переделать этому Set сравнение с объектами?
Тогда зачем такой Set нужен?
Если я правильно понял, его и делали как раз таким чтобы он умел правильно сравнивать если у него такой элемент или нет.

Может тебе просто в тот Set не так засовывать свои объекты? Или вовсе не засовывать, если "равные" не должны быть равными...
Казалось бы, элементарный вопрос: Выяснить, присутствует объект с таким набором атрибутов в списке или нет. В других языках решается на раз. Или в этом недоязыке такое невозможно?
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087676
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ведущий профессионал , обзывать ЯП не обязательно... Особенно если не умеешь с ним работать. Это тебя показывает слабым специалистом.
Ты ведь вообще никакого ЯП не написал, а уже хаешь чужую работу.

Даже в доке по Set() четко написано как он работает
Код: javascript
1.
2.
3.
var o = {a: 1, b: 2};
mySet.add(o);
mySet.add({a: 1, b: 2}); // переменная o связана с другим объектом, поэтому данная строка также сработает


Т.е. тебе нужно просто понять что в JS это разные объекты. Т.е. сравнивать нужно что-то действительно одинаковое.

Как сравнивать одинаковое - я тебе показал на примерах выше. И статейку для разъяснения тебе дал...
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087678
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ведущий профессионал
Выяснить, присутствует объект с таким набором атрибутов в списке или нет. В других языках решается на раз. Или в этом недоязыке такое невозможно?

Я х/з в каких ЯР "решается на раз" сравнение сложных элементов...

Но если тебе нужно получить список ключей объекта в JS есть нативный метод Object.keys()
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

Но с ним так же нужно уметь работать.

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
const o1 = {a:1, b:2}
const o2 = {b:2, a:1}
let a1 = Object.keys(o1)
let a2 = Object.keys(o2)
alert(a1)
alert(a2)
a1 = a1.sort()
a2 = a2.sort()
alert(a1)
alert(a2)
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087687
alectr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно так. С помощью коллбэк функции.

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
        class ExtendedSet extends Set {
            constructor(iterable) {
                super(iterable);
            }
            /**
             * isEqualFunction type = (object1, object2) => boolean
             */
            add(value, isEqualFunction) {
                if (!isEqualFunction) {
                    return super.add(value);
                }
                for (const item of this.values()) {
                    if (isEqualFunction(item, value)) {
                        return this;
                    }
                }
                return super.add(value);
            }
        }



Код: javascript
1.
2.
3.
4.
5.
6.
7.
const set = new ExtendedSet([{a:1},{b:2}]);
set.add({a:1}, (l,r)=>JSON.stringify(l) === JSON.stringify(r));
set.size // 2
set.add({b:2}, (l,r)=>JSON.stringify(l) === JSON.stringify(r));
set.size // 2
set.add({c:3}, (l,r)=>JSON.stringify(l) === JSON.stringify(r));
set.size // 3
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087689
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ведущий профессионал
Выяснить, присутствует объект с таким набором атрибутов в списке или нет. В других языках решается на раз. Или в этом недоязыке такое невозможно?

Может быть другие недоязыки просто оперируют недообъектами?

Код: javascript
1.
2.
3.
4.
5.
6.
7.
let a1 = {x: 1, y: 2, prev: null, next: null}
let a2 = {a: 3, b: 4, prev: a1, next: null}
a1.next = a2;

let b1 = {x: 1, y: 2, prev: null, next: null}
let b2 = {a: 3, b: 4, prev: b1, next: null}
b1.next = b2



Как в других языках на раз сравнить на равенство a1 и b1?
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087716
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ведущий профессионал
Логично выдаёт false. Надо, чтобы выдавало true.

Посчитай хеш объекта, засунь его в сет.
Ведущий профессионал
Быстрое гугление не помогло. А читать с нуля учебник на тысячу страниц долго.

Тоже мне профессионал. Попробуй головой подумать в следующий раз.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087717
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alectr
Можно так. С помощью коллбэк функции.

Костыль. JSON.stringify - это очень медленно.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087721
alectr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
alectr
Можно так. С помощью коллбэк функции.

Костыль. JSON.stringify - это очень медленно.


Смысл был не стрингифай показать, а как один из вариантов экстенда оригинального Set.
stringify никогда не использовал в реальных проектах как сравнение объектов.
Он вдобавок не умеет сериализовать Map, Set и прочее.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087746
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster

Костыль. JSON.stringify - это очень медленно.


crutchmaster

Посчитай хеш объекта, засунь его в сет.


Хеш считать быстрее, чем JSON.stringify?

Прежде чем решать задачу, надо поставить условия.

С какими объектами надо иметь дело? В Js все что не примитивный тип, то объект. И массивы - объекты, и всякие Map, Set, RegExp - объекты, И даже функции тоже объекты.
Нужно как то ограничить.
Какие поля будут у сравниваемых объектов? Только примитивных типов? А методы допустимы? А надо ли учитывать прототипы?
И т.д. и т.п.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087751
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alectr
как один из вариантов экстенда оригинального Set

Не пойдёт такой вариант эктенда, тем более, если искать проходом c for..of и делать преобразование каждого элемента, бррр. Это убивает весь смысл set'а.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087755
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voraa
Хеш считать быстрее, чем JSON.stringify?

Точно быстрее, чем делать stringify указанным образом, доставая каждый элемент из сета и сравнивая. Даже тупо склеить значения в строку будет быстрее.
Плюс stringify не нужно использовать для всяких служебных полей, ссылок, set'ов, map'ов, функций, цикличных ссыкол и прочего. В общем случае это работать не будет.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087764
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster

Точно быстрее, чем делать stringify указанным образом, доставая каждый элемент из сета и сравнивая. Даже тупо склеить значения в строку будет быстрее.
Плюс stringify не нужно использовать для всяких служебных полей, ссылок, set'ов, map'ов, функций, цикличных ссыкол и прочего. В общем случае это работать не будет.

stringify - встроенная функция, написанная на ассемблере и оптимизированная. Она работает быстрее, чем то же самое написать на JS и потом выполнять этот байткод. Даже "тупо склеить значения в строку" будет медленнее.
В JS нет встроенной функции вычисления хешей объектов.
Только самому писать. Причем с учетом хешей для сетов, мепов и с учетом циклически ссылок.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087772
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ранее ребята давали ссылки на ресурсы, там можно было легко проверить "что быстрее"...
Но, за не надобностью, я те ссылки утерял.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087776
alectr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
Не пойдёт такой вариант эктенда

Не пойдет для чего?

crutchmaster
тем более, если искать проходом c for..of

А каким то другим проходом проверить уникальность объектов в рамках структуры данных Set (да и любой другой) будет быстрее? Здесь нужно знать что вообще пытается решить автор, возможно ему это и не нужно.
,
crutchmaster
и делать преобразование каждого элемента, брррх

Какое преобразование? Вы имеете ввиду всё тот же stringify? Если да, то вероятно вы не можете отделить мух от котлет в данном случае. Ну вызовите тогда так (зная свойство определяющее уникальность объекта) - set.add({a:1}, (l,r)=>l.id === r.id);.
Коллбэк позволяет подпихнуть любую функцию для сравнения, подпихнете туда стрингифай, значит будет преобразование, не подпихнете, значит не будет.

crutchmaster
Это убивает весь смысл set'а.

Из слов автора
"На С++ я понимаю, что надо реализовать класс и переопределить у него оператор сравнения"
Кажется что ему нужно именно изменить поведение класса set. Какую он решает задачу, хз, за что купил как говорится.
Вполне вероятно ему Set в принципе не нужен.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087785
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voraa
stringify - встроенная функция, написанная на ассемблере и оптимизированная. Она работает быстрее, чем то же самое написать на JS и потом выполнять этот байткод.

Во-первых, не на ассемблере, а на плюсах.
Во-вторых, на v8 есть jit компилятор, а не только байткод,
В-третьих, никто не предлагает писать stringify на js.
В-четвёртых, вот еще тебе прикол с stringify:
Код: sql
1.
2.
3.
4.
JSON.stringify({a:1, b:1}); 
// >'{"a":1,"b":1}'
JSON.stringify({b:1, a:1}); 
// >'{"b":1,"a":1}'


Так что удачи с сетом на нём
voraa
Даже "тупо склеить значения в строку" будет медленнее.

Что угодно будет быстрее только за счёт того, что не надо будет перебирать элементы сета и что-то с ними делать, каждый раз добавляя туда элемент.
voraa
В JS нет встроенной функции вычисления хешей объектов.

На языках с ВМ есть пул иммутабельных строк, а там у каждой строки есть хэш. Если этого не хватает, да, двигать биты, впрочем, как делают везде.
voraa
Только самому писать.

Как в жабке делают хеш произвольного класса? Да, сидят и сами пишут, представь себе.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087788
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alectr
Не пойдет для чего?

Ни для чего, кроме лабы.

alectr
А каким то другим проходом проверить уникальность объектов в рамках структуры данных Set (да и любой другой) будет быстрее?

Её не надо проверять. Вообще не надо перебирать сет. Если его перебирать, то он нафиг не нужен, проще сделать свой сет с каким-то там бинарным деревом для своих объектов на жс или разложить их по объектам, где каждый ключ будет значением из вносимого объекта в каком-то порядке.

alectr
Ну вызовите тогда так (зная свойство определяющее уникальность объекта)

Да без разницы, что вызывать. Перебор и так не очень быстрый, особенно for..of. Проверь какой-нибудь задрипанный миллион элементов на вхождение в миллионный сет и получи до 1*10**14 вызовов твоей функции.

alectr
Кажется что ему нужно именно изменить поведение класса set

Превращая его в массив и делая его обход при каждой вставке. Это не поведение set, он так себя не ведёт.

А потом говорят, что js тормозит, да.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087789
alectr
crutchmaster
Не пойдёт такой вариант эктенда

Не пойдет для чего?

crutchmaster
тем более, если искать проходом c for..of

А каким то другим проходом проверить уникальность объектов в рамках структуры данных Set (да и любой другой) будет быстрее? Здесь нужно знать что вообще пытается решить автор, возможно ему это и не нужно.
,
crutchmaster
и делать преобразование каждого элемента, брррх

Какое преобразование? Вы имеете ввиду всё тот же stringify? Если да, то вероятно вы не можете отделить мух от котлет в данном случае. Ну вызовите тогда так (зная свойство определяющее уникальность объекта) - set.add({a:1}, (l,r)=>l.id === r.id);.
Коллбэк позволяет подпихнуть любую функцию для сравнения, подпихнете туда стрингифай, значит будет преобразование, не подпихнете, значит не будет.

crutchmaster
Это убивает весь смысл set'а.

Из слов автора
"На С++ я понимаю, что надо реализовать класс и переопределить у него оператор сравнения"
Кажется что ему нужно именно изменить поведение класса set. Какую он решает задачу, хз, за что купил как говорится.
Вполне вероятно ему Set в принципе не нужен.


В первом посте совершенно чётко изложена формулировка задачи. И даже на русском языке.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087794
В общем, я понял. С объектам Set в этом недоязыке работать не умеет. Только со строками и прочими примитивными типами. Надо просто вручную преобразовывать объект в строку перед обращением к Set:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
let set = new Set()

//set.add( { p1: 'aaa', p2: 'bbb' } )
//console.log( set.has( { p1: 'aaa', p2: 'bbb' } ) )

set.add( 'aaa bbb' )
console.log( set.has( 'aaa bbb' ) )


Ну, или иным способом считать хэш применительно к конкретной задаче (у меня в данных пробелов нет, потому объединение через пробел подходит).
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087796
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ведущий профессионал
С объектам Set в этом недоязыке работать не умеет.

С содержимым объектов, профи.
Код: sql
1.
2.
3.
a = {a : 1}
b = {a : 1}
//a и b - два разных объекта с одинаковым содержимым


Впрочем, как другие недоязыки типа жабки или питона.
Ведущий профессионал
(у меня в данных пробелов нет, потому объединение через пробел подходит).

Подходило бы, даже если бы они и были. Главное не обделайся с порядком. Ключи перебираются в том же порядке, каком были добавлены, так что надеяться на него не стоит. Ты же не знаешь, что с ним делали по дороге до тебя.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087797
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--
...
Рейтинг: 0 / 0
25 сообщений из 82, страница 1 из 4
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Сложные структуры в качестве ключа в set
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]