2015-10-12 2 views
23

new Set(['b', 'a', 'c']).sort() throws TypeError: set.sort is not a function. Как я могу сортировать Set для обеспечения определенного порядка итераций?Как я могу сортировать ES6 `Set`?

+5

Наборы являются неупорядоченными. – SLaks

+0

@SLaks, возможно, они есть, но я хотел бы воспользоваться преимуществами уникальных ключей, которые 'Set' предлагают, хотя они все еще могут сортировать элементы. Java предлагает ['SortedSet'] (http://docs.oracle.com/javase/7/docs/api/java/util/SortedSet.html), я могу только предположить, что они сделали это, потому что кто-то предложил действительный пример использования ... ES6 не должен быть Java, но сортировка наборов кажется полезной. – ericsoco

+0

Вы не можете сортировать() 'a' SortedSet'. Он использует древовидную структуру, которая позволяет обходить порядок, но вы не можете * изменить * этот порядок, как с помощью 'ArrayList'. Если вы хотите изменить заказ, используйте списки. –

ответ

47

Набор не упорядоченная структура абстрактных данных.

А однако всегда имеет один и тот же порядок итераций - порядок вставки элемента [1], поэтому, когда вы его итерации (путем повторного метода, вызывая Symbol.iterator или по циклу), вы всегда можете ожидать, что ,

Вы всегда можете преобразовать множество в массив и отсортировать его.

Array.from(new Set(["b","a","c"])).sort(); 
[...(new Set(["b","a","c"]))].sort(); // with spread. 

[1] forEach и CreateSetIterator

+2

Удалил свой собственный ответ, аналогичный этому, но добавит обратно мой комментарий: «Я действительно надеюсь, что кто-то может предоставить ответ, который не требует перехода от« Установить »к« Массив »и обратно. Кажется довольно неэффективным «. – ericsoco

+6

@ericsoco Спецификация ECMAScript не определяет «OrderedSet», но аналогичная структура данных существует на нескольких других языках, как правило, реализуется деревом. Вы можете использовать библиотеку коллекций пользовательских коллекций, а именно - популярный ImmutableJS предоставляет ['OrderedSet'] (https://facebook.github.io/immutable-js/docs/#/OrderedSet). В самом деле, это, вероятно, будет более эффективным во многих случаях. Поэтому, если у вас есть набор с более чем 100K элементами, я бы определенно рассмотрел использование упорядоченной реализации. –

+0

Обратите внимание, что для набора чисел вы должны дать сортировку функции сравнения: '(x, y) => x - y'. Ваши номера будут отсортированы лексикографически иначе. – neo

Смежные вопросы