如何将Set转换为Array?

时间:2013-11-19 11:06:40

标签: javascript arrays collections syntax ecmascript-harmony

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

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

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

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

如果不存在这样的选项,那么可能有一个很好的惯用的单行代码呢?比如,使用for...of或类似的?

11 个答案:

答案 0 :(得分:707)

  

如果不存在这样的选项,那么也许有一个很好的惯用语   这样做的单线程?比如,用于...或类似的?

确实,有几种方法可以将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)];

答案 1 :(得分:61)

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

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

var myArr = [...mySet];

或者,使用Array.from

var myArr = Array.from(mySet);

答案 2 :(得分:12)

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

_.uniq([])

这取决于使用underscorelo-dash

答案 3 :(得分:4)

使用spread Operator获得所需的结果

var arrayFromSet = [...set];

答案 4 :(得分:3)

也许到了晚会,但你可以做到以下几点:

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)

答案 5 :(得分: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 equals value2 => The value contained in the the current position in the Set. The same value is passed for both arguments

在IE11下工作。

答案 6 :(得分:0)

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

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

中非常容易

例如,您可以使用index:3

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

var book = [ //defined by var = book
    {
        "id": 39, //Category ID
        "title": "Last Read A",
        "url": "Chapter URL A",
    },
    {
        "id": 37, //Category ID
        "title": "Last Read B",
        "url": " Chapter URL C",
    },
    {
        "id": 2, //Category ID
        "title": "Last Read C",
        "url": " Chapter URL C",
    }
]

var book1 = [ //defined by var = newest
    {
        "id": 39, //Category ID
        "title": "Newest Chapter A",
        "url": "Post URL Chapter A",
    },
    {
        "id": 37, //Category ID
        "title": "Newest Chapter B",
        "url": " Post URL Chapter C",
    },
    {
        "id": 2, //Category ID
        "title": "Newest Chapter C",
        "url": " Post URL Chapter C",
    },
    
 //Added a different book with id 10
    {
        "id": 10, //Category ID
        "title": "Newest Chapter C",
        "url": " Post URL Chapter C",
    }
]

const bookIds = book1.map(bookData => bookData.id);

console.log('BookIDS:', bookIds)


book.forEach(bookData => {
  if(bookIds.indexOf(bookData.id) > -1){
    console.log('Matching book found with ID:', bookData.id);
  }
})

您只需使用以下命令即可将其转换:

...

结果是:

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

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

其他常用方式:

const b = [...a];

或使用像这样的循环

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

答案 7 :(得分: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);

答案 8 :(得分:0)

最简单的答案

只需将集合散布在[]

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

结果:[1,5]

答案 9 :(得分:-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.

答案 10 :(得分:-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]);