powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Сложные структуры в качестве ключа в set
82 сообщений из 82, показаны все 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
Сложные структуры в качестве ключа в set
    #40087798
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все шагают не в ногу, только ведущий профессионал в ногу....
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087799
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно... С каких ЯП приходят все эти грамотеи что JS, и много кто еще, обзываются ими как "недоязыки"?
Или они программки пишут волшебной палочкой, которая может обеспечить мгновенную проверку на "совпадение" сложных элементов языка...
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087806
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa
Интересно... С каких ЯП приходят все эти грамотеи что JS, и много кто еще, обзываются ими как "недоязыки"?

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

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

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

Программист на фортране может писать на фортране на любом языке!
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087824
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
вадя,

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

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


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

Подходило бы, даже если бы они и были. Главное не обделайся с порядком. Ключи перебираются в том же порядке, каком были добавлены, так что надеяться на него не стоит. Ты же не знаешь, что с ним делали по дороге до тебя.
В других языках я могу переопределить оператор сравнения. И объекты будут сравниваться так, как я хочу, а не так, как хочет язык.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087835
krvsa
Интересно... С каких ЯП приходят все эти грамотеи что JS, и много кто еще, обзываются ими как "недоязыки"?
Или они программки пишут волшебной палочкой, которая может обеспечить мгновенную проверку на "совпадение" сложных элементов языка...
Да, внезапно, в других языках программист может задать свой оператор сравнения.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087836
crutchmaster
krvsa
Интересно... С каких ЯП приходят все эти грамотеи что JS, и много кто еще, обзываются ими как "недоязыки"?

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

Во-первых, не на ассемблере, а на плюсах.
Во-вторых, на v8 есть jit компилятор, а не только байткод,

Немного устарелые сведения и недопонимание, как происходит оптимизация (на примере V8)
Встроенные функции сейчас написаны на CSA (CodeStubAssembler) Это некий универсальный ассемблерный язык, позволяющий работать с памятью и объектами JS, который компилируется в ассемблер конкретной машины. От С++ для функций отказались.

Обработка JS программ в V8 происходит следующим образом:
Сначала происходит синтаксический разбор и строится AST (Абстрактное синтаксическое дерево)
Затем интерпретатор Ignition выполняет его, генерует байткод для выполняемых операторов и исполняет его (конечно повторно байткод не генерится) Фактически для каждой функции байткод генерится только в момент ее первого вызова.

Есть оптимизирующий компилятор TurboFan, который может преобразовать байткод в оптимизированный ассемблерный код. Но происходит это далеко не всегда. Сначала для каждой функции собирается статистика ее вызовов. Одно из требований что бы каждый раз функция вызывалась с одинаковыми типами параметров. (Кстати 1 и 1. - это разные типы. {a:1, b:2} и {b:3, a:4} - это разные типы, [1,2,3,4] и [1,2,3.,4] - тоже разные типы) И только после того, как соберется хорошая статистика (а это несколько тысяч вызовов данной функции) принимается решение оптимизировать ее TurboFan
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087847
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ведущий профессионал
krvsa
Интересно... С каких ЯП приходят все эти грамотеи что JS, и много кто еще, обзываются ими как "недоязыки"?
Или они программки пишут волшебной палочкой, которая может обеспечить мгновенную проверку на "совпадение" сложных элементов языка...
Да, внезапно, в других языках программист может задать свой оператор сравнения.

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

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

Я рад за тебя.
Но только в JS это вообще не требовалось никогда. Потому этого и нет. Тут достаточно средств для решения проблем.

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

P.S.
Сравнение с веганом поддерживаю.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087858
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa
Ведущий профессионал
в других языках программист может задать свой оператор сравнения.

Я рад за тебя.
Но только в JS это вообще не требовалось никогда. Потому этого и нет. Тут достаточно средств для решения проблем.


Ну мне иногда хотелось бы иметь возможность переопределить + для сложения векторов или * и / для умножений делений вектора на число. Да и === для сравнения равенства точек (а == для равенства с некоторой погрешностью).
Мечты... мечты...
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087863
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voraa , для реализации "желания" не обязательно переделывать "стандартные символы операций", можно написать функцию или метод, который будет возвращать нужный результат.

Т.е. не
Код: javascript
1.
a + b


а
Код: javascript
1.
sum(a, b)
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087864
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa
voraa , для реализации "желания" не обязательно переделывать "стандартные символы операций", можно написать функцию или метод, который будет возвращать нужный результат.

Т.е не

Код: javascript
1.
(a+2*(b-c))/4;



A

Код: javascript
1.
div((add(a, mul(sub(b,c),2))), 4);



Ну, что. Красиво. Наглядно, Понятно (Если со скобками не напортачил).

От колбеков в свое время отказались еще и по причине их ненаглядности. Сложности разбираться что там кого за кем вызывает.
Промисы проще и нагляднеею
А async/await еще проще и нагляднее
Ведь по эффективности и возможностям колбеки ничем не уступают.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087865
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voraa , не обязательно писать все в одну кучу.

Ну и коронный вопрос - вам с шашечками или ехать?
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087868
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa,
Конечно ехать. (Но иногда надежнее ехать с шашечками).
Просто JS хорош. Но коего чего не хватает. Есть, так сказать, отдельные недостатки.
Его улучшают, как могут. Но не кардинально. Просто синтаксический сахар, чаще всего.
Подавляющее большинство синтаксических конструкций, которые появились за последние годы ничего кардинально нового не ввели.
Начиная с class , кончая последними операторами, типа .? или ?? . Все это было возможно делать и другими средствами. Не так кратко и красиво, но возможно.
Нового, чего раньше не было, и совсем уж проблематично реализовать - Symbol, Генераторы, Приватные поля. Пожалуй больше ничего и в голову не приходит.

Ну согласитесь, что с перегрузкой операторов и защищенными полями JS стал бы гораздо лучше.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087872
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voraa
Ну согласитесь, что с перегрузкой операторов и защищенными полями JS стал бы гораздо лучше.

Какие наши годы! Будет потребность - будут и добавки.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087983
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa
Ведущий профессионал , вот нашел тебе статейку на тему "сравнения объектов"...
https://codeguru.info/kak-sravnit-obekty-v-javascript/

Там есть разные варианты с примерами.
все эти сравнения развалятся, если в объекте есть симболы, "ромбы" или (особенно) циклы.

по сабжу - либо назначать объектам уникальный id, либо использовать иммутабельность, либо таки да, придумать функцию сериализации в строку.
непонятно, какова задача, какая судьба у объектов и что с ними может происходить.
формулировка в стартовом посте лишена смысла.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40087989
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1
"ромбы" или (особенно) циклы

Покажи примеры этих элементов.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088004
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa,
У объектов могут быть методы. Как сравнивать одинаковы ли функции?
Объекты имееют прототип. Одинаковы ли элементы, если они имеют разный прототип?
Те примеры дадут, что
Код: javascript
1.
2.
let a = [0,1,2,3]
let b = {'0':0, '1':1, '2':2, '3':3, length:4}


одинаковые объекты.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088032
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЖС в этом плане действительно отсталый язык. Где нет ни оверлоада функций нормального с типами, ни мульти диспатч, ни екстеншен методов, ни сложных структур данных, ни понимания хеш/еквалити и т.п.

А то что ничего из этого не нужно. Это как зелен виноград. Это все нужные вещи.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088034
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЖС это идеи ЛИСП которые за несколько дней превратили во что то типа Java чтобы выглядело привычно и лучше продавалось.

Каким то чудом все это довольно хорошо заработало.

Затем Гугл и другие влили океаны бабла, и превратил это в достаточно хороший язык.

Затем Микрософт добавил ТайпСкрипт и получилось вполне нормально.

Но многие базовые, тривиальные и нужные вещи, просто невозможно добавить не разрушив уже сложившиеся жаваскрипт практики и совместимость. Поэтому даже накачанный до предела баблом и в принципе довольно неплохой язык жаваскрипт так и остается с рядом фундаментальных дефектов.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088035
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А через много лет разработчики жаваскрипта придумывают глубокие идеи и принцыпы языка, "The JavaScript Way", чтобы обьяснить его странности и особенности :). Хотя основная концепция JS это "... я его слепила из того что было ..."
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088050
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voraa
Мечты... мечты...

Беллард в quickjs сделал. Может лет через 5 и коммитет раздуплится. Можешь устроить там драму в обсуждениях, подтолкнуть его.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088051
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
private
ЖС в этом плане действительно отсталый язык. Где нет ни оверлоада функций нормального с типами, ни мульти диспатч, ни екстеншен методов, ни сложных структур данных, ни понимания хеш/еквалити и т.п.

Это динамический слаботипизированный язык, такой же, как, например, луа. Откуда там может взяться оверлоад функций, типы и пр., болезный?
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088052
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
private
рядом фундаментальных дефектов

То, что рыба плавает, а не летает, видимо тоже фундаментальный дефект рыбы, лул.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088055
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чето не понимаю, как можно сравнивать stringify для двух объектов, типа
{a:1,b:2} и {b:2,a:1}.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088064
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voraa
У объектов могут быть методы. Как сравнивать одинаковы ли функции?

У меня не было надобности в таком сравнении. Т.ч. не у того спрашиваешь...
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088084
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторУ меня не было надобности в таком сравнении. Т.ч. не у того спрашиваешь.
у меня тоже.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088293
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa
Имя пользователя1
"ромбы" или (особенно) циклы

Покажи примеры этих элементов.

Код: javascript
1.
2.
3.
4.
5.
6.
7.
// ромб
const x = {};
x.y = x.z = {a:1};

// цикл
const x = {};
x.y = x;



ну и всякие комбинации того-сего.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088301
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чего только не насмотришься...
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088304
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa
Чего только не насмотришься...

Да я соавниваю, что надо сравнивать. Например, в цикле, или ещё как. И не парюсь. Это не часто нужно.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088391
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSerge , сейчас с этими юнит тестами валом всяких библиотек для сравнения тех же объектов...
Подключай и используй.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088393
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот одна из таких
http://underscorejs.org/#isEqual
Или вот...
https://jestjs.io/ru/docs/using-matchers
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088396
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa
voraa
У объектов могут быть методы. Как сравнивать одинаковы ли функции?

У меня не было надобности в таком сравнении. Т.ч. не у того спрашиваешь...

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

undescore не работает с произвольными объектами.
Все не проверял, но

Код: javascript
1.
2.
let s = Symbol()
console.log(_.isEqual({a:1, b:2}, {a:1, b:2, [s]:3}))   // -> true
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088436
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voraa
undescore не работает с произвольными объектами.

Напиши им в жлоб лист - пусть доделывают.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088442
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa
voraa
undescore не работает с произвольными объектами.

Напиши им в жлоб лист - пусть доделывают.
хрен они доделают - поля-симболы не итерируются (это типа такой сейф для данных: если на руках нет симбола, то никак не доберешься до поля).
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088443
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имя пользователя1
хрен они доделают - поля-симболы не итерируются (это типа такой сейф для данных: если на руках нет симбола, то никак не доберешься до поля).

В смысле? Ну не итерируются через for-in.
Но есть же Object.getOwnPropertySymbols
Можно через него.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088445
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВСе правильно андерскор делает, весь смысл символов чтобы они были невидимыми, и соотв. не обнаруживались стандартными операциями.

А вытащить символ таки можно

```
let s = Symbol()
Object.getOwnPropertySymbols({a:1, b:2, [s]:3})
```
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088448
alectr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Or
Код: javascript
1.
Reflect.ownKeys({[Symbol.for('testSymbol')]: 'symbol value', prop2: 2, prop3: {}}); // ["prop2", "prop3", Symbol(testSymbol)]
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088449
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
private
ВСе правильно андерскор делает, весь смысл символов чтобы они были невидимыми, и соотв. не обнаруживались стандартными операциями.

А вытащить символ таки можно

```
let s = Symbol()
Object.getOwnPropertySymbols({a:1, b:2, [s]:3})
```

Речь идет о равенстве объектов.
Логично предположить, что если объекты равны, то любые действия с этими объектами дадут одинаковый результат

Код: javascript
1.
2.
3.
4.
5.
6.
7.
let s = Symbol()
let o1 = {a:1, b:2}; 
let o2 = {a:1, b:2, [s]:3}
console.log(_.isEqual(o1, o2))   // -> true с точки зрения андерскора объекты равны

console.log (Object.getOwnPropertySymbols(o1).length)  // -> 0
console.log (Object.getOwnPropertySymbols(o2).length)  // -> 1  а результаты разные



И что считать "стандартными" операциями?
По мне любая функция входящая в реализацию движка вполне стандартна.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088459
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ведущий профессионал
]В других языках я могу переопределить оператор сравнения. И объекты будут сравниваться так, как я хочу, а не так, как хочет язык.


Серьезно?
В С++ можно переопределить оператор сравнения, что бы сравнивать произвольные объекты? Ну хотя бы почти произвольные?
Хоть черновик набросайте, как это сделать

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

Да легко. Преобразуй в *void и сравнивай побайтно.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088592
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster
voraa
В С++ можно переопределить оператор сравнения, что бы сравнивать произвольные объекты? Ну хотя бы почти произвольные?

Да легко. Преобразуй в *void и сравнивай побайтно.

Ну ты хитрый, умелый программер. Большой знаток.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
struct A {
  short x;
  short y[2];
};

struct B {
  short x[2];
  short y;
}

A a = {1,2,3};
B b = {1,2,3};



a == b?
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088608
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема то вроде пустяковая
Есть какие то структуры

struct A {...};
struct B {...};
struct C {....};
.....
Есть "объекты"

A a1, a2;
B b1, b2;
C c1, c2;

И должно быть проще пареной репы в таком могучем языке, с великой перегрузкой операторов, со всякими хешами...
Написать метод сравнения a1 c b1? c1 c c2, c2 c a2... Короче любой объект с любым


Или в недоязыке C++ такое невозможно?
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088673
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
voraa
В С++ можно переопределить оператор сравнения, что бы сравнивать произвольные объекты? Ну хотя бы почти произвольные?

Да легко. Преобразуй в *void и сравнивай побайтно.
объекты могут содержать указатели на другие объекты, этот вариант не прокатит
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40088762
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voraa
a == b?

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

Нужна просто более забористрая рекурсивная макросня, которая будет генерировать код для метода преобразования, который в свою очередь будет обходить ссылки. Ну или что у них там вместо макросни? Что-то было для всяких извратных compiletime вещей.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40094667
voraa
Проблема то вроде пустяковая
Есть какие то структуры

struct A {...};
struct B {...};
struct C {....};
.....
Есть "объекты"

A a1, a2;
B b1, b2;
C c1, c2;

И должно быть проще пареной репы в таком могучем языке, с великой перегрузкой операторов, со всякими хешами...
Написать метод сравнения a1 c b1? c1 c c2, c2 c a2... Короче любой объект с любым


Или в недоязыке C++ такое невозможно?
Можете привести пример задачи, где необходимо сравнение объектов разных типов?
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40094746
voraa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ведущий профессионал
]В других языках я могу переопределить оператор сравнения. И объекты будут сравниваться так, как я хочу, а не так, как хочет язык.

Вот я и хочу сравнивать произвольные объекты. Если разных типов, то не равны. А если одного типа, то сравнивать значения...
А где? Ну там же, где кто то требует подобного от JS
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40094979
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
voraa
А если одного типа, то сравнивать значения

Значения чего? Массивы объектов одного типа, объекты бывают вложенные. А еще есть функции, генераторы, регулярки, символы, промисы, etc. Как ты их будешь сравнивать? Отвечаешь на все эти вопросы, пишешь какой-нибудь очередной equalsDeep. Делов-то.
...
Рейтинг: 0 / 0
Сложные структуры в качестве ключа в set
    #40095371
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ведущий профессионал
Можете привести пример задачи, где необходимо сравнение объектов разных типов?


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


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