如何将集合转换为数组?

IT技术 javascript arrays collections syntax ecmascript-harmony
2021-02-27 22:12:22

Set似乎是创建具有保证唯一元素的数组的好方法,但它没有公开任何获取属性的好方法,除了 generator [Set].values,它以一种笨拙的方式调用mySet.values.next().

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

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

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

如果不存在这样的选项,那么也许有一个很好的惯用单线来做到这一点?喜欢,使用for...of,或类似?

6个回答

如果不存在这样的选项,那么也许有一个很好的惯用单线来做到这一点?像,使用 for...of 或类似的?

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

使用 Array.from

let array = Array.from(mySet);

简单地spreading在数组中设置

let array = [...mySet];

老式的方式,迭代并推送到一个新数组(集合确实有forEach

let array = [];
mySet.forEach(v => array.push(v));

以前,使用非标准的,现在已弃用的数组理解语法:

let array = [v for (v of mySet)];
这在 Safari(8) 或 Chrome (41) 中不起作用。但它确实适用于 Firefox(35)。
2021-04-15 22:12:22
var array = [v for (v of mySet)];不适用于chrome 46
2021-04-15 22:12:22
我认为最优雅的方式就是简单[...mySet]
2021-04-19 22:12:22
@WojciechBednarski l33t 不优雅如果有任何一个例子,那就是Array.from(mySet);
2021-04-19 22:12:22
只是想补充一下[...mySet]使用 Typescript 编译时存在的问题(请参阅此问题),因此Array.from(mySet)如果您打算在不久的将来转换为 Typescript,则使用起来可能更安全
2021-04-27 22:12:22

通过https://speakerdeck.com/anguscroll/es6-uncensored by Angus Croll

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

var myArr = [...mySet];

或者,或者,使用Array.from

var myArr = Array.from(mySet);
我没有投反对票,但我在最新版本的 Chrome 中尝试了这个并失败了,所以这不仅仅是 IE 问题。
2021-04-17 22:12:22
请参阅kangax.github.io/compat-table/es6了解或多或少的最新支持图表。目前,在所有桌面浏览器中,只有 FF 和 IE TP(又名 Spartan,又名 MS Non-IE 浏览器)支持Array.from...
2021-04-30 22:12:22
为什么要投反对票?这种方法有什么问题吗?或者有人试图在 IE11 中执行此代码并失败;)
2021-05-08 22:12:22
看起来 Firefox 是唯一支持Array.from. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-05-10 22:12:22
在这里你可以为 Chrome 启用它。chrome://flags/#enable-javascript-harmony记住它是实验性的,暂时不要认为这是一个很好的开发解决方案。
2021-05-11 22:12:22

假设您只是Set临时使用来获取数组中的唯一值,然后转换回数组,请尝试使用以下命令:

_.uniq([])

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

不幸的是唯一的跨兄弟解决方案
2021-04-28 22:12:22

也许参加聚会迟到了,但您可以执行以下操作:

const set = new Set(['a', 'b']);
const values = set.values();
const array = Array.from(values);

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

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

const set = new Set(['a', 'b']);
const array = [...set]; // or Array.from(set)
这个答案是错误的。您不需要调用.entries,也不需要.values正如上面提到的@Buffalo -Array.from(set)就足够了。
2021-04-15 22:12:22
@c69 确实如此。在这个答案的时候,Array.from()没有按预期工作。但现在传播,Array.from()两者都工作得很好。
2021-04-20 22:12:22
你可以使用 var array = Array.from(set);
2021-04-24 22:12:22
似乎使用set.entries()你会得到成对的数组。您可以使用set.values()来获取普通数组。
2021-05-07 22:12:22
@ShimonRachlenko 是真的,用户确实要求这样做。
2021-05-09 22:12:22

使用扩展运算符获得您想要的结果

var arrayFromSet = [...set];