如何将Set转换为Array?


469

Set似乎是一种创建具有保证唯一元素的Array的好方法,但是它没有公开任何获取属性的好方法,除了Generator [Set] .values之外,后者以尴尬的方式调用mySet.values.next()

如果可以map在Set上调用和类似的函数,那应该没问题。但是您也不能那样做。

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

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

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

Answers:


849

如果不存在这样的选择,那么也许有一个很好的惯用单行代码?喜欢,用于...或类似的东西?

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

使用 Array.from

let array = Array.from(mySet);

只需spreading将阵列中的列

let array = [...mySet];

以旧的方式迭代并推入新数组(Sets具有forEach

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

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

let array = [v for (v of mySet)];

7
这在Safari(8)或Chrome(41)中不起作用。但是它确实可以在Firefox(35)中工作。
425nesp

2
var array = [v for (v of mySet)];不适用于Chrome 46
Eric

18
我认为最优雅的方法就是简单[...mySet]
Wojciech Bednarski'3

18
@WojciechBednarski l33t不优雅。如果有任何例子,那就是Array.from(mySet);
布法罗

3
只是想补充一点,[...mySet]使用Typescript编译时会出现问题(请参见此问题),所以Array.from(mySet)如果您打算在不久的将来转换为Typescript ,那么使用起来可能会更安全。
伊万·古扎利

65

通过https://speakerdeck.com/anguscroll/es6-未经Angus Croll的审查

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

var myArr = [...mySet];

或者,使用Array.from

var myArr = Array.from(mySet);

1
为什么要投票?这种方法有什么问题吗?还是有人试图在IE11中执行此代码而失败?;)
c69 2014年

6
我没有投票,但是我在最新版本的Chrome中尝试了此操作,但失败了,所以这不仅仅是IE问题。
Meshaal 2015年

3
请参阅kangax.github.io/compat-table/es6以了解或多或少的最新支持表。当前,在所有桌面浏览器中,仅支持FF和IE TP(又名Spartan,又名MS Non-IE浏览器),Array.from以及...
c69 2015年

看起来Firefox是唯一支持的浏览器Array.fromdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
425nesp

1
您可以在此处为Chrome启用它。chrome://flags/#enable-javascript-harmony请记住,实验性的暂时不要认为这是开发的理想解决方案。
sospedra 2015年

12

假设您只是Set临时使用以获取数组中的唯一值,然后再转换回数组,请尝试使用此方法:

_.uniq([])

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


不幸的是,唯一的跨代理解决方案
Marco Sulla

6

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

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

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

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

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

1
看来使用set.entries()会得到成对的数组。您可以set.values()用来获取普通数组。
Shimon Rachlenko '16

@ShimonRachlenko正确,用户确实要求这样做。
罗兰

2
您可以使用var array = Array.from(set);
布法罗

这个答案是错误的。您不需要致电.entries,也不需要.values。正如上面提到的@Buffalo- Array.from(set)足够了。
c69

1
@ c69是正确的。在回答此问题时,Array.from()未按预期工作。但是现在传播了,Array.from()两者都很好。
罗兰



0

使用Set并将其转换为数组非常类似于复制Array ...

因此,您可以使用相同的方法来复制数组,这在ES6中非常容易

例如,您可以使用 ...

想象一下,您在下面有这个套装:

const a = new Set(["Alireza", "Dezfoolian", "is", "a", "developer"]);

您可以使用以下命令简单地将其转换:

const b = [...a];

结果是:

["Alireza", "Dezfoolian", "is", "a", "developer"]

数组,现在您可以使用可用于数组的所有方法...

其他常用方法:

const b = Array.from(a);

或使用像这样的循环:

const b = [];
a.forEach(v => b.push(v));


-1

这是从数组中仅获取唯一原始值的简单方法。如果将数组转换为Set,然后再执行从Set转换为array的转换。此转换仅适用于原始值,对于数组中的对象无效。自己尝试。

    let myObj1 = {
        name: "Dany",
        age: 35,
        address: "str. My street N5"
    }

    let myObj2 = {
        name: "Dany",
        age: 35,
        address: "str. My street N5"
    }

    var myArray = [55, 44, 65, myObj1, 44, myObj2, 15, 25, 65, 30];
    console.log(myArray);

    var mySet = new Set(myArray);
    console.log(mySet);

    console.log(mySet.size === myArray.length);// !! The size differs because Set has only unique items

    let uniqueArray = [...mySet];
    console.log(uniqueArray); 
    // Here you will see your new array have only unique elements with raw 
    // values. The objects are not filtered as unique values by Set.
    // Try it by yourself.

-1

最简单的答案

只是将集合传播到[]

let mySet = new Set()
mySet.add(1)
mySet.add(5)
mySet.add(5) 
let arr = [...mySet ]

结果:[1,5]

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.