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

Javascript 如何对ES6`Set`进行排序?,javascript,arrays,sorting,set,ecmascript-6,Javascript,Arrays,Sorting,Set,Ecmascript 6,newset(['b','a','c']).sort()抛出TypeError:Set.sort不是函数。如何对集合进行排序以确保特定的迭代顺序?集合不是有序的抽象数据结构 然而,集合始终具有相同的迭代顺序-元素插入顺序[1],因此当您迭代它时(通过迭代方法、通过调用Symbol.iterator、或通过for..of循环),您总是可以预料到这一点 您始终可以将集合转换为数组并对其进行排序 Array.from(new Set(["b","a","c"])).sort(); [...(new S

newset(['b','a','c']).sort()
抛出
TypeError:Set.sort不是函数
。如何对
集合进行排序以确保特定的迭代顺序?

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

然而,
集合
始终具有相同的迭代顺序-元素插入顺序[1],因此当您迭代它时(通过迭代方法、通过调用
Symbol.iterator
、或通过for..of循环),您总是可以预料到这一点

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

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

[1] 和

在某些情况下,最好将集合“排序”到位,类似于
array.sort()
,可以这样做:

功能排序集(集合){
常量条目=[];
for(集合的常量成员){
条目。推送(成员);
}
set.clear();
for(条目的常量条目。sort()){
set.add(条目);
}
返回集;
};
排序集(新集合([3,2,1]))
//=>集合(3){1,2,3}

最简单的方法

console.log(new Set(['b', 'a', 'c'].sort()))
//Set(3) {"a", "b", "c"}

集合是无序的。@SLaks可能是无序的,但我希望能够利用
Set
s提供的唯一键的优势,同时仍然能够对元素进行排序。Java提供了,我只能假设他们这样做是因为有人提供了一个有效的用例。。。ES6不应该是Java,但排序集似乎很有用。您也不能
sort()
a
SortedSet
。它使用允许按顺序遍历的树结构,但不能像使用
ArrayList
那样更改此顺序。如果您想更改顺序,请使用lists。可能需要一些研究,但我认为
Set
保留顺序
新的Set(['b','a','c'].sort())
@Slai我找不到任何关于元素顺序的语句。删除了我自己的答案,与此相同,但将添加回我的注释:“我真的希望有人能提供一个不需要从
Set
Array
再返回的答案。看起来效率很低。“@ericsoco ECMAScript规范没有指定
OrderedSet
,但在多种其他语言中存在类似的数据结构-通常由树实现。您可以使用userland collections库,即-流行的ImmutableJS提供了一个。事实上,在很多情况下,这可能会更有效率。因此,如果你有一个超过100k个元素的集合,我肯定会考虑使用有序集合实现。请注意,对于一组数字,你必须给出一个比较函数:<代码>(x,y)=x -y < /COD>。否则,你的数字将按字典顺序排列。@BenjaminGruenbaum:我想你误解了什么;根据其文档,Immutable.js的
OrderedSet
使用插入顺序作为迭代顺序;也就是说,根据您的回答,它所做的事情与标准的
Set
所做的事情是一样的。@ruakh然而,一个ImmutableJS
OrderedSet
对象确实允许您对其内容进行排序(),而标准的
Set
不允许这样做,而b)是OP想要的功能。