Як я можу відсортувати ES6 `Set`?


77

new Set(['b', 'a', 'c']).sort()кидає TypeError: set.sort is not a function. Як я можу відсортувати a, Setщоб забезпечити певний порядок ітерацій?


9
Набори не упорядковані.
Слакс

3
Можливо, це і є @SLaks, але я хотів би мати можливість скористатися перевагами унікальних ключів, які Setпропонуються, і при цьому мати можливість сортувати елементи. Java пропонує SortedSets , я можу лише припустити, що вони це зробили, тому що хтось запропонував дійсний варіант використання ... ES6 не повинен бути Java, але сортування наборів здається корисним.
ericsoco

1
Ви не можете ні sort()те, SortedSetні інше . Він використовує деревоподібну структуру, яка дозволяє здійснювати обхід в порядку, але ви не можете змінити це впорядкування, як у випадку з ArrayList. Якщо ви хочете змінити порядок, використовуйте списки.
Вийшов - Аноні-Мус

1
можливо, знадобляться деякі дослідження, але я думаю, що Setзберігає порядокnew Set(['b', 'a', 'c'].sort())
Слай

@Slai ecma-international.org/ecma-262/9.0/index.html#sec-set-objects Я не можу знайти жодного твердження про порядок елементів.
закінчення

Відповіді:


141

Набір не є впорядкованою абстрактною структурою даних.

SetОднак A завжди має однаковий порядок ітерацій - порядок вставки елемента [1], тому, коли ви його повторюєте (методом ітерації, викликом Symbol.iteratorабо циклом for ..), ви завжди можете цього очікувати.

Ви завжди можете перетворити набір у масив і відсортувати його.

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

[1] forEachта CreateSetIterator


2
Видаляється мій власний відповідь , який так само , як це, але додасть назад мій коментар: «Я дійсно сподіваюся , що хто - то може дати відповідь , який не вимагає переходу від Setдо Array. І назад здається досить неефективно.»
ericsoco

12
@ericsoco специфікація ECMAScript не вказує, OrderedSetале схожа структура даних існує у багатьох інших мовах - як правило, реалізована деревом. Ви можете використовувати бібліотеку колекцій користувачів, а саме - популярний ImmutableJS надає OrderedSet. Дійсно, це, швидше за все, буде ефективнішим у багатьох випадках. Отже, якщо у вас набір із понад 100 тис. Елементів - я б напевно розглянув можливість використання впорядкованого набору реалізацій.
Бенджамін Груенбаум,

9
Зверніть увагу , що для набору чисел ви повинні дати свого роду функцію порівняння: (x, y) => x - y. В іншому випадку ваші номери будуть відсортовані лексикографічно.
нео

@BenjaminGruenbaum: Я думаю, ви щось неправильно зрозуміли; відповідно до своєї документації, Immutable.js's OrderedSetвикористовує порядок вставки як порядок ітерацій; тобто робить те саме, що відповідно до вашої відповіді Setробить стандарт .
ruahh

1
@ruakh Однак ImmutableJS OrderedSetоб'єкт дійсно дозволяють сортувати () його зміст, який : а) стандарт Set робить , і б) функціональність OP хотів.
Джеймі Ріддінг,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.