Комментарии 21
я.. автор множества
function compare_set< Value extends Set<any> >( left: Value, right: Value ): boolean {
if( left.size !== right.size ) return false
return compare_iterator( left.values(), right.values() )
}
У вас сравнение двух одинаковых множеств Set([1, 2]) и Set([2, 1]) даёт false. Интересно, какой была аргументация в пользу такого решения?
Они не одинаковые - у них разный порядок итерирования.
В математическом смысле порядок элементов для Set не важен. isEqual из lodash дает правильный результат true.
Очень даже важен: https://ru.wikipedia.org/wiki/Линейно_упорядоченное_множество
Суть множества не в отсутствии порядка, а в отсутствии дубликатов.
Множество может быть пустым и непустым, упорядоченным и неупорядоченным
(c) https://ru.wikipedia.org/wiki/Множество
А может и не быть, @funcaправ.
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Set
В JS Ordered Set. Короткое название вводит в заблуждение неокрепшие умы.
А где там сказано, что оно упорядоченное? Там только замечание о том, в какой последовательности можно итерировать элементы множества.
В JS у множества (Set) есть метод values(), который возвращает Последовательность (Sequency) элементов в том же порядке, в котором их туда добавляли. Фактически это преобразование объекта одного типа в объект другого. Будет-ли сравнение последовательностей эквивалентно сравнению множеств нужно было доказать прежде, чем писать код и тесты его производительности.
Лучше тут https://ru.m.wikipedia.org/wiki/Множество в разделе "Отношения между множествами". Упрощённо, два множества равны если каждый элемент одного множества так же принадлежит и другому, и наоборот.
Линейно-упорядоченным (PoSet) множество становится если для него дополнительно задать операцию, определяющую частичный порядок (partial order) его элементов (меньше-или-равно). Проще говоря - функцию сравнения двух элементов. Определение равенства самих множеств это не меняет.
Я бы с вами согласился, но я сам реализовывал RLE на Node через простой Map, пользуясь порядком итерирования, так что подход @nin-jin может быть и надежнее. Возможно даже стоит регулировать поведение отдельным флагом.
![](https://habrastorage.org/getpro/habr/upload_files/018/634/b0f/018634b0f63e49397640797928463477.png)
Зачем к свойству right
обращаться через компьютед проперти аксес?
Не увидел кровавых подробностей двойных викмапов и так и не понял как сравнивать глубоко и быстро
Сравниваем структуры хоть и глубоко, но быстро