如何对ES6`Set`进行排序?


76

new Set(['b', 'a', 'c']).sort()抛出TypeError: set.sort is not a function。如何排序Set以确保特定的迭代顺序?


9
集是无序的。
Slaks 2015年

2
@SLaks也许是,但是我希望能够利用提供的唯一键Set的优势,同时仍然能够对元素进行排序。Java提供SortedSets,我只能假设他们这样做是因为有人提供了有效的用例... ES6不应是Java,但是排序集似乎很有用。
ericsoco 2015年

1
你不能sort()一个SortedSet无论是。它使用允许按顺序遍历的树结构,但是您不能像使用一样更改此顺序ArrayList。如果要更改顺序,请使用列表。
已退出-Anony-Mousse 2015年

1
可能需要一些研究,但我认为可以Set维持秩序new Set(['b', 'a', 'c'].sort())
Slai 18'Jul

@Slai ecma-international.org/ecma-262/9.0/index.html#sec-set-objects我找不到有关元素顺序的任何声明。
ceving

Answers:


137

集合不是有序的抽象数据结构。

Set然而总是具有相同的迭代顺序-元件插入顺序[1],所以当你重复它(通过迭代方法中,通过调用Symbol.iterator,或者通过为..循环的),则可以总是期望。

您始终可以将集合转换为数组并对其进行排序。

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

[1]forEachCreateSetIterator


2
删除了我自己的答案是一样的这一点,但会加回我的意见:“我真的希望有人能够提供一种不需要从去一个答案SetArray。和背部看起来非常低效。”
ericsoco 2015年

12
@ericsoco ECMAScript规范未指定,OrderedSet但是其他多种语言中也存在类似的数据结构-通常由树实现。您可以使用userland集合库,即-流行的ImmutableJS提供了一个OrderedSet。实际上,在许多情况下,这样做可能会更有效率。因此,如果您有一个包含超过100K元素的集合-我一定会考虑使用有序集合实现。
本杰明·格林鲍姆

7
请注意,对于一组数字,您必须提供排序比较功能:(x, y) => x - y。否则,您的电话号码将按字典顺序排序。
2016年

@BenjaminGruenbaum:我认为您误会了一些东西;根据其文档,Immutable.jsOrderedSet使用插入顺序作为迭代顺序;也就是说,它的作用与标准回答的Set作用相同。
ruakh

@ruakh但是,ImmutableJSOrderedSet对象确实允许您对其内容进行sort(),a)标准Set 不支持,b)OP想要的功能。
杰米·里丁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.