我怎样才能对ES6`Set`进行排序?

eri*_*oco 56 javascript arrays sorting set ecmascript-6

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

Ben*_*aum 99

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

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

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

Array.from(new Set(["b","a","c"])).sort();
[...(new Set(["b","a","c"]))].sort(); // with spread.
Run Code Online (Sandbox Code Playgroud)

[1] forEachCreateSetIterator

  • @ericsoco ECMAScript规范没有指定`OrderedSet`,但是在其他多种语言中存在类似的数据结构 - 通常由树实现.您可以使用userland集合库,即 - 流行的ImmutableJS提供[`OrderedSet`](https://facebook.github.io/immutable-js/docs/#/OrderedSet).事实上,在很多情况下这可能会更有效率.因此,如果你有一个超过100K元素的集合 - 我肯定会考虑使用有序集合实现. (10认同)
  • @ruakh 但是,ImmutableJS `OrderedSet` 对象*确实*允许您对其内容进行排序(),a)标准 `Set` *不*,b)是OP想要的功能。 (4认同)
  • 请注意,对于一组数字,您必须给一个排序比较函数:`(x,y)=> x-y`。否则,您的电话号码将按字典顺序排序。 (3认同)
  • 删除了我自己的答案,与此相同,但会添加我的评论:"我真的希望有人可以提供一个答案,不需要从'Set`到'Array`然后回来.看起来非常低效. " (2认同)
  • @BenjaminGruenbaum:我认为你误解了一些东西;根据其文档,Immutable.js 的“OrderedSet”使用*插入顺序*作为迭代顺序;也就是说,根据您的回答,它与标准“Set”执行的操作相同。 (2认同)