如何将Set转换为Array?

c69*_*c69 427 javascript arrays collections syntax ecmascript-harmony

套装似乎是一个很好的方式来创建保证唯一的元素数组,但它不公开任何好的办法来获取属性,除了发电机[设置] .values,被称为在一个尴尬的方式mySet.values.next().

如果您可以map在集合上调用和类似的函数,那就没问题了.但你也不能这样做.

我试过了Array.from,但似乎只是将类似数组(NodeList和TypedArrays?)的对象转换为Array.另一个尝试:Object.keys对Sets不起作用,而Set.prototype没有类似的静态方法.

所以,问题:是否有任何方便的内置方法来创建具有给定Set值的数组?(元素的顺序并不重要).

如果没有这样的选择,那么也许有一个很好的惯用的单行代码呢?喜欢,使用for...of或类似?

ade*_*neo 772

如果没有这样的选择,那么也许有一个很好的惯用的单行代码呢?比如,用于...或类似的?

事实上,有几种方法的转换设置一个数组:

运用 Array.from

let array = Array.from(mySet);
Run Code Online (Sandbox Code Playgroud)

只需spreading在数组中设置

let array = [...mySet];
Run Code Online (Sandbox Code Playgroud)

旧的时尚方式,迭代并推送到一个新的阵列(集合有forEach)

let array = [];
mySet.forEach(v => array.push(v));
Run Code Online (Sandbox Code Playgroud)

以前,使用非标准,现在不推荐使用的数组解析语法:

let array = [v for (v of mySet)];
Run Code Online (Sandbox Code Playgroud)

  • 我认为最优雅的方式就是`[... mySet]`. (17认同)
  • @WojciechBednarski l33t不是_elegant_.如果有任何例子,那就是`Array.from(mySet);` (16认同)
  • 只是想补充一点,使用 Typescript 编译时 `[...mySet]` 有问题(请参阅 [this issue](https://github.com/Microsoft/TypeScript/issues/8856)),所以使用 `[...mySet]` 可能更安全Array.from(mySet)` 如果您打算在不久的将来转换为 Typescript。 (13认同)
  • 出于某种原因,这对我来说不适用于最新的Chrome. (12认同)
  • 这在Safari(8)或Chrome(41)中不起作用.但它确实可以在Firefox(35)中使用. (7认同)
  • 顺便说一句,如果有人关心速度,这里有一个从最快到最慢的排名:#1。老式(forEach/for of);#2. Array.from(慢约 5%);#3。传播(约慢 12%) (6认同)
  • `var array = [v for(v of mySet)];`在[tag:Chrome]中不起作用46 (2认同)

c69*_*c69 65

通过https://speakerdeck.com/anguscroll/es6-由Angus Croll提供

事实证明,我们可以使用spread运算符:

var myArr = [...mySet];
Run Code Online (Sandbox Code Playgroud)

或者,或者,使用Array.from:

var myArr = Array.from(mySet);
Run Code Online (Sandbox Code Playgroud)

  • 我没有downvote,但我在最新版本的Chrome中尝试了这个并且失败了,所以它不仅仅是IE问题. (5认同)
  • 请参阅https://kangax.github.io/compat-table/es6/获取更多或更少的最新支持图表.目前,在所有桌面浏览器中,只有FF和IE TP(又名Spartan,又名MS非IE浏览器)支持`Array.from`和`...` (3认同)
  • 为什么要投反对票?这种方法有什么问题吗?或者有人试图在 IE11 中执行此代码_但失败了_?;) (2认同)

fre*_*emn 12

假设您只是Set暂时使用数组中的唯一值然后转换回数组,请尝试使用:

_.uniq([])
Run Code Online (Sandbox Code Playgroud)

这依赖于使用下划线lo-dash.


Rol*_*and 5

也许到晚了聚会,但是您可以执行以下操作:

const set = new Set(['a', 'b']);
const values = set.values();
const array = Array.from(values);
Run Code Online (Sandbox Code Playgroud)

在支持ES6的浏览器中,或者如果您的填充程序正确地填充了上述功能,这应该可以正常工作。

编辑:今天您可以使用@ c69建议:

const set = new Set(['a', 'b']);
const array = [...set]; // or Array.from(set)
Run Code Online (Sandbox Code Playgroud)

  • 您可以只使用`var array = Array.from(set);` (2认同)

Vig*_*gan 5

使用传播算子获得您想要的结果

var arrayFromSet = [...set];
Run Code Online (Sandbox Code Playgroud)