如何将Set转换为Array?

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

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

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

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

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

斯丁2020/03/13 18:11:11

这是从数组中仅获取唯一原始值的简单方法。如果将数组转换为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.
JinJin阿飞番长2020/03/13 18:11:11

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

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);
阳光猪猪2020/03/13 18:11:11

就我而言,解决方案是:

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下工作。

LEYJim2020/03/13 18:11:11

使用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));
2020/03/13 18:11:11

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

_.uniq([])

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

ProTony2020/03/13 18:11:11

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

Indeed, there are several ways to convert a Set to an Array:

using Array.from

let array = Array.from(mySet);

Simply spreading the Set out in an array

let array = [...mySet];

The old fashion way, iterating and pushing to a new array (Sets do have forEach)

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

Previously, using the non-standard, and now deprecated array comprehension syntax:

let array = [v for (v of mySet)];
Mandy路易2020/03/13 18:11:11

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

var arrayFromSet = [...set];
泡芙Stafan2020/03/13 18:11:11

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

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

var myArr = [...mySet];

或者,使用Array.from

var myArr = Array.from(mySet);