667

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

如果您可以map在 Sets 上调用和类似功能,这将是可以的。但你也不能那样做。

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

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

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

4

11 回答 11

1188

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

实际上,有几种方法可以将Set转换为Array

使用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)];
于 2013-11-19T11:46:07.327 回答
88

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

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

var myArr = [...mySet];

或者,或者,使用Array.from

var myArr = Array.from(mySet);
于 2014-01-17T19:59:29.780 回答
16

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

_.uniq([])

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

于 2015-06-22T00:50:54.080 回答
9

也许迟到了,但你可以做以下事情:

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)
于 2015-10-31T11:47:35.510 回答
5

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

var arrayFromSet = [...set];
于 2016-11-17T14:25:08.443 回答
0

就我而言,解决方案是:

var testSet = new Set();
var testArray = [];

testSet.add("1");
testSet.add("2");
testSet.add("2"); // duplicate item
testSet.add("3");

var someFunction = function (value1, value2, setItself) {
    testArray.push(value1);
};

testSet.forEach(someFunction);

console.log("testArray: " + testArray);

value1 等于 value2 => Set 中当前位置包含的值。为两个参数传递相同的值

在IE11下工作。

于 2018-10-22T12:42:13.860 回答
0

使用Set并将其转换为数组与复制数组非常相似...

所以你可以使用相同的方法来复制一个数组,这在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));
于 2018-12-28T12:07:59.673 回答
0

下面的代码从数组创建一个集合,然后使用...运算符。

var arr=[1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,];
var set=new Set(arr);
let setarr=[...set];
console.log(setarr);
于 2019-12-31T10:26:07.750 回答
0

最简单的答案

只需将集合传播到 []

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

结果:[1,5]

于 2020-05-05T02:07:26.080 回答
-1

这是一种从数组中仅获取唯一原始值的简单方法。如果将数组转换为 Set 并在此之后进行从 Set 到数组的转换。此转换仅适用于原始值,对于数组中的对象无效。自己试试吧。

    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.
于 2019-12-16T15:21:48.773 回答
-1

我宁愿从删除数组中的重复项开始,然后尝试排序。从新数组中返回第一个元素。

    function processData(myArray) {
        var s = new Set(myArray);
        var arr = [...s];
        return arr.sort((a,b) => b-a)[1];
    }
    
    console.log(processData([2,3,6,6,5]);
于 2021-02-19T13:30:00.357 回答