|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
Помогите нубу в JS. Использую Node.js Код: javascript 1. 2. 3. 4. 5.
Логично выдаёт false. Надо, чтобы выдавало true. На С++ я понимаю, что надо реализовать класс и переопределить у него оператор сравнения, чтобы сравнивал по значению свойств. Как это сделать на JavaScript ? Быстрое гугление не помогло. А читать с нуля учебник на тысячу страниц долго. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2021, 21:09 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
Можно попробовать спросить в профильной ветке Модератор: Тема перенесена из форума "Java". ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2021, 21:36 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
Ведущий профессионал Логично выдаёт false. Надо, чтобы выдавало true. На С++ я понимаю, что надо реализовать класс и переопределить у него оператор сравнения, чтобы сравнивал по значению свойств. Как это сделать на JavaScript ? Я х/з что там за Set... Но для сравнения объектов есть несколько путей. Например самый простой Код: javascript 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.07.2021, 10:30 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
Ведущий профессионал , вот нашел тебе статейку на тему "сравнения объектов"... https://codeguru.info/kak-sravnit-obekty-v-javascript/ Там есть разные варианты с примерами. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.07.2021, 10:40 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
krvsa Я х/з что там за Set... Почитал про этот Set... https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Set Так ты хочешь как-то сам переделать этому Set сравнение с объектами? Тогда зачем такой Set нужен? Если я правильно понял, его и делали как раз таким чтобы он умел правильно сравнивать если у него такой элемент или нет. Может тебе просто в тот Set не так засовывать свои объекты? Или вовсе не засовывать, если "равные" не должны быть равными... ... |
|||
:
Нравится:
Не нравится:
|
|||
31.07.2021, 11:03 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
krvsa krvsa Я х/з что там за Set... Почитал про этот Set... https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Set Так ты хочешь как-то сам переделать этому Set сравнение с объектами? Тогда зачем такой Set нужен? Если я правильно понял, его и делали как раз таким чтобы он умел правильно сравнивать если у него такой элемент или нет. Может тебе просто в тот Set не так засовывать свои объекты? Или вовсе не засовывать, если "равные" не должны быть равными... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2021, 20:23 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
Ведущий профессионал , обзывать ЯП не обязательно... Особенно если не умеешь с ним работать. Это тебя показывает слабым специалистом. Ты ведь вообще никакого ЯП не написал, а уже хаешь чужую работу. Даже в доке по Set() четко написано как он работает Код: javascript 1. 2. 3.
Т.е. тебе нужно просто понять что в JS это разные объекты. Т.е. сравнивать нужно что-то действительно одинаковое. Как сравнивать одинаковое - я тебе показал на примерах выше. И статейку для разъяснения тебе дал... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2021, 21:02 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
Ведущий профессионал Выяснить, присутствует объект с таким набором атрибутов в списке или нет. В других языках решается на раз. Или в этом недоязыке такое невозможно? Я х/з в каких ЯР "решается на раз" сравнение сложных элементов... Но если тебе нужно получить список ключей объекта в 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2021, 21:09 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
Можно так. С помощью коллбэк функции. Код: javascript 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Код: javascript 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2021, 22:01 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
Ведущий профессионал Выяснить, присутствует объект с таким набором атрибутов в списке или нет. В других языках решается на раз. Или в этом недоязыке такое невозможно? Может быть другие недоязыки просто оперируют недообъектами? Код: javascript 1. 2. 3. 4. 5. 6. 7.
Как в других языках на раз сравнить на равенство a1 и b1? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.08.2021, 22:07 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
Ведущий профессионал Логично выдаёт false. Надо, чтобы выдавало true. Посчитай хеш объекта, засунь его в сет. Ведущий профессионал Быстрое гугление не помогло. А читать с нуля учебник на тысячу страниц долго. Тоже мне профессионал. Попробуй головой подумать в следующий раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2021, 05:15 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
alectr Можно так. С помощью коллбэк функции. Костыль. JSON.stringify - это очень медленно. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2021, 05:16 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
crutchmaster alectr Можно так. С помощью коллбэк функции. Костыль. JSON.stringify - это очень медленно. Смысл был не стрингифай показать, а как один из вариантов экстенда оригинального Set. stringify никогда не использовал в реальных проектах как сравнение объектов. Он вдобавок не умеет сериализовать Map, Set и прочее. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2021, 07:11 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
crutchmaster Костыль. JSON.stringify - это очень медленно. crutchmaster Посчитай хеш объекта, засунь его в сет. Хеш считать быстрее, чем JSON.stringify? Прежде чем решать задачу, надо поставить условия. С какими объектами надо иметь дело? В Js все что не примитивный тип, то объект. И массивы - объекты, и всякие Map, Set, RegExp - объекты, И даже функции тоже объекты. Нужно как то ограничить. Какие поля будут у сравниваемых объектов? Только примитивных типов? А методы допустимы? А надо ли учитывать прототипы? И т.д. и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2021, 09:45 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
alectr как один из вариантов экстенда оригинального Set Не пойдёт такой вариант эктенда, тем более, если искать проходом c for..of и делать преобразование каждого элемента, бррр. Это убивает весь смысл set'а. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2021, 09:55 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
voraa Хеш считать быстрее, чем JSON.stringify? Точно быстрее, чем делать stringify указанным образом, доставая каждый элемент из сета и сравнивая. Даже тупо склеить значения в строку будет быстрее. Плюс stringify не нужно использовать для всяких служебных полей, ссылок, set'ов, map'ов, функций, цикличных ссыкол и прочего. В общем случае это работать не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2021, 09:59 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
crutchmaster Точно быстрее, чем делать stringify указанным образом, доставая каждый элемент из сета и сравнивая. Даже тупо склеить значения в строку будет быстрее. Плюс stringify не нужно использовать для всяких служебных полей, ссылок, set'ов, map'ов, функций, цикличных ссыкол и прочего. В общем случае это работать не будет. stringify - встроенная функция, написанная на ассемблере и оптимизированная. Она работает быстрее, чем то же самое написать на JS и потом выполнять этот байткод. Даже "тупо склеить значения в строку" будет медленнее. В JS нет встроенной функции вычисления хешей объектов. Только самому писать. Причем с учетом хешей для сетов, мепов и с учетом циклически ссылок. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2021, 10:14 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
Ранее ребята давали ссылки на ресурсы, там можно было легко проверить "что быстрее"... Но, за не надобностью, я те ссылки утерял. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2021, 10:28 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
crutchmaster Не пойдёт такой вариант эктенда Не пойдет для чего? crutchmaster тем более, если искать проходом c for..of А каким то другим проходом проверить уникальность объектов в рамках структуры данных Set (да и любой другой) будет быстрее? Здесь нужно знать что вообще пытается решить автор, возможно ему это и не нужно. , crutchmaster и делать преобразование каждого элемента, брррх Какое преобразование? Вы имеете ввиду всё тот же stringify? Если да, то вероятно вы не можете отделить мух от котлет в данном случае. Ну вызовите тогда так (зная свойство определяющее уникальность объекта) - set.add({a:1}, (l,r)=>l.id === r.id);. Коллбэк позволяет подпихнуть любую функцию для сравнения, подпихнете туда стрингифай, значит будет преобразование, не подпихнете, значит не будет. crutchmaster Это убивает весь смысл set'а. Из слов автора "На С++ я понимаю, что надо реализовать класс и переопределить у него оператор сравнения" Кажется что ему нужно именно изменить поведение класса set. Какую он решает задачу, хз, за что купил как говорится. Вполне вероятно ему Set в принципе не нужен. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2021, 10:38 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
voraa stringify - встроенная функция, написанная на ассемблере и оптимизированная. Она работает быстрее, чем то же самое написать на JS и потом выполнять этот байткод. Во-первых, не на ассемблере, а на плюсах. Во-вторых, на v8 есть jit компилятор, а не только байткод, В-третьих, никто не предлагает писать stringify на js. В-четвёртых, вот еще тебе прикол с stringify: Код: sql 1. 2. 3. 4.
Так что удачи с сетом на нём voraa Даже "тупо склеить значения в строку" будет медленнее. Что угодно будет быстрее только за счёт того, что не надо будет перебирать элементы сета и что-то с ними делать, каждый раз добавляя туда элемент. voraa В JS нет встроенной функции вычисления хешей объектов. На языках с ВМ есть пул иммутабельных строк, а там у каждой строки есть хэш. Если этого не хватает, да, двигать биты, впрочем, как делают везде. voraa Только самому писать. Как в жабке делают хеш произвольного класса? Да, сидят и сами пишут, представь себе. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2021, 10:51 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
alectr Не пойдет для чего? Ни для чего, кроме лабы. alectr А каким то другим проходом проверить уникальность объектов в рамках структуры данных Set (да и любой другой) будет быстрее? Её не надо проверять. Вообще не надо перебирать сет. Если его перебирать, то он нафиг не нужен, проще сделать свой сет с каким-то там бинарным деревом для своих объектов на жс или разложить их по объектам, где каждый ключ будет значением из вносимого объекта в каком-то порядке. alectr Ну вызовите тогда так (зная свойство определяющее уникальность объекта) Да без разницы, что вызывать. Перебор и так не очень быстрый, особенно for..of. Проверь какой-нибудь задрипанный миллион элементов на вхождение в миллионный сет и получи до 1*10**14 вызовов твоей функции. alectr Кажется что ему нужно именно изменить поведение класса set Превращая его в массив и делая его обход при каждой вставке. Это не поведение set, он так себя не ведёт. А потом говорят, что js тормозит, да. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2021, 11:01 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
alectr crutchmaster Не пойдёт такой вариант эктенда Не пойдет для чего? crutchmaster тем более, если искать проходом c for..of А каким то другим проходом проверить уникальность объектов в рамках структуры данных Set (да и любой другой) будет быстрее? Здесь нужно знать что вообще пытается решить автор, возможно ему это и не нужно. , crutchmaster и делать преобразование каждого элемента, брррх Какое преобразование? Вы имеете ввиду всё тот же stringify? Если да, то вероятно вы не можете отделить мух от котлет в данном случае. Ну вызовите тогда так (зная свойство определяющее уникальность объекта) - set.add({a:1}, (l,r)=>l.id === r.id);. Коллбэк позволяет подпихнуть любую функцию для сравнения, подпихнете туда стрингифай, значит будет преобразование, не подпихнете, значит не будет. crutchmaster Это убивает весь смысл set'а. Из слов автора "На С++ я понимаю, что надо реализовать класс и переопределить у него оператор сравнения" Кажется что ему нужно именно изменить поведение класса set. Какую он решает задачу, хз, за что купил как говорится. Вполне вероятно ему Set в принципе не нужен. В первом посте совершенно чётко изложена формулировка задачи. И даже на русском языке. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2021, 11:01 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
В общем, я понял. С объектам Set в этом недоязыке работать не умеет. Только со строками и прочими примитивными типами. Надо просто вручную преобразовывать объект в строку перед обращением к Set: Код: javascript 1. 2. 3. 4. 5. 6. 7.
Ну, или иным способом считать хэш применительно к конкретной задаче (у меня в данных пробелов нет, потому объединение через пробел подходит). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2021, 11:12 |
|
Сложные структуры в качестве ключа в set
|
|||
---|---|---|---|
#18+
Ведущий профессионал С объектам Set в этом недоязыке работать не умеет. С содержимым объектов, профи. Код: sql 1. 2. 3.
Впрочем, как другие недоязыки типа жабки или питона. Ведущий профессионал (у меня в данных пробелов нет, потому объединение через пробел подходит). Подходило бы, даже если бы они и были. Главное не обделайся с порядком. Ключи перебираются в том же порядке, каком были добавлены, так что надеяться на него не стоит. Ты же не знаешь, что с ним делали по дороге до тебя. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2021, 11:17 |
|
|
start [/forum/topic.php?fid=22&fpage=3&tid=1443196]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
75ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
others: | 256ms |
total: | 441ms |
0 / 0 |