Javascript 如何将集合转换为数组?

Javascript 如何将集合转换为数组?,javascript,arrays,collections,syntax,ecmascript-harmony,Javascript,Arrays,Collections,Syntax,Ecmascript Harmony,Set似乎是创建具有保证的唯一元素的数组的好方法,但除了generator[Set].values之外,它没有公开任何获取属性的好方法,而generator[Set].values是以一种笨拙的方式调用的mySet.values.next() 如果您可以调用集合上的map和类似函数,这就可以了。但你也不能这么做 我尝试了Array.from,但似乎只将类似数组(NodeList和TypedArrays?)的对象转换为数组。另一次尝试:Object.keys不适用于Set,Set.prototyp

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

如果您可以调用集合上的
map
和类似函数,这就可以了。但你也不能这么做

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

因此,问题是:是否有任何方便的内置方法来创建具有给定集合的值的数组?(元素的顺序实际上并不重要)

如果不存在这样的选项,那么可能有一个很好的惯用单行程序来实现这一点?例如,使用<代码>作为的…或类似的

如果不存在这样的选项,那么可能有一个很好的习惯用法 做那件事要一个班轮吗?例如,用于……的,或类似的

实际上,有几种方法可以将a转换为:

使用

简单地说,数组中的

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

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

安格斯·克罗尔via酒店

事实证明,我们可以使用
spread
操作符:

var myArr = [...mySet];
或者,也可以使用:


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

_.uniq([])

这取决于使用或。

可能会迟到,但您可以执行以下操作:

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)

使用spread运算符获得所需的结果

var arrayFromSet = [...set];

就我而言,解决办法是:

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);


在IE11下工作。

使用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));

下面是一种从数组中仅获取唯一原始值的简单方法。如果将数组转换为集合,则在此之后,执行从集合到数组的转换。此转换仅适用于原始值,对于数组中的对象无效。你自己试试看

    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.

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

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);

最简单的答案

只要把布景放进去就行了

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

结果:[1,5]

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

    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]);

为什么要投否决票?这种方法有什么问题吗?或者有人试图在IE11中执行此代码,但失败了?;)我没有投反对票,但我在最新版本的Chrome中尝试了这一点,但失败了,所以这不仅仅是IE的问题。请参阅,以获得或多或少最新的支持图表。目前,在所有桌面浏览器中,只有FF和IE TP(又名Spartan,又名MS非IE浏览器)支持
数组。from
看起来Firefox是唯一支持
数组的浏览器。from
。在这里,您可以为Chrome
chrome://flags/#enable-javascript harmony
记住它是实验性的,暂时不要认为这是一个很好的开发解决方案。这在Safari(8)或Chrome(41)中不起作用。但是它在Firefox(35)中也能工作在46中不起作用我认为最优雅的方式就是
[…mySet]
@WojciechBednarski l33t不优雅。如果其中任何一个例子是这样的,那么它就是
Array.from(mySet)
只是想补充一点,
[…mySet]
在使用Typescript编译时存在问题(请参阅),因此如果您打算在不久的将来转换为Typescript,使用
数组(从(mySet)
可能会更安全。似乎使用
set.entries()
可以获得对数组。您可以使用
set.values()
来获取普通数组。@ShimonRachlenko true,用户确实要求这样做。您只需使用
var array=array.from(set).entries
,也不需要调用
.values
。正如上面提到的@Buffalo-
Array.from(set)
就足够了。@c69是这样的。在回答此问题时,
Array.from()
未按预期工作。但是现在spread和
Array.from()
都可以正常工作。不幸的是,这是唯一的cross broser解决方案。这是什么?
const b = [];
a.forEach(v => b.push(v));
    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.
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);
let mySet = new Set()
mySet.add(1)
mySet.add(5)
mySet.add(5) 
let arr = [...mySet ]
    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]);