Как стать автором
Обновить

Комментарии 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.

А где там сказано, что оно упорядоченное? Там только замечание о том, в какой последовательности можно итерировать элементы множества.

Это замечание о том, как работает их итератор. Можете заглянуть в спецификацию языка, если не в курсе, что все объекты в JS упорядоченные.

В JS у множества (Set) есть метод values(), который возвращает Последовательность (Sequency) элементов в том же порядке, в котором их туда добавляли. Фактически это преобразование объекта одного типа в объект другого. Будет-ли сравнение последовательностей эквивалентно сравнению множеств нужно было доказать прежде, чем писать код и тесты его производительности.

Да что уж там, сперва надо доказать, что метод values() вообще существует, а то мало ли наврали в спецификации.

Пожалуйста продолжайте, вас ни кто не ограничивает.

Лучше тут https://ru.m.wikipedia.org/wiki/Множество в разделе "Отношения между множествами". Упрощённо, два множества равны если каждый элемент одного множества так же принадлежит и другому, и наоборот.

Линейно-упорядоченным (PoSet) множество становится если для него дополнительно задать операцию, определяющую частичный порядок (partial order) его элементов (меньше-или-равно). Проще говоря - функцию сравнения двух элементов. Определение равенства самих множеств это не меняет.

А упорядоченное множество, которое в JS, - это кортеж из неупорядоченного множества и отношения порядка. И два упорядоченных множества равны, если равны в том числе и их отношения порядка.

Я бы с вами согласился, но я сам реализовывал RLE на Node через простой Map, пользуясь порядком итерирования, так что подход @nin-jin может быть и надежнее. Возможно даже стоит регулировать поведение отдельным флагом.

НЛО прилетело и опубликовало эту надпись здесь

Зачем к свойству right обращаться через компьютед проперти аксес?

НЛО прилетело и опубликовало эту надпись здесь

Да, вместо простого right['message'] придётся писать ( right as any ).message.

Как понять зависит?

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

Ну, если по картинке не понятно, то можно заглянуть в исходники.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории