如何将集合转换为数组?

问题描述 投票:0回答:10

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

mySet.values.next()
的尴尬方式调用。

如果你可以在 Sets 上调用

map
和类似的函数,那就没问题了。但你也不能这样做。

我已经尝试过

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

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

如果不存在这样的选项,那么也许有一个很好的惯用语可以做到这一点?比如,使用

for...of
或类似的?

javascript arrays collections syntax ecmascript-harmony
10个回答
1544
投票

如果不存在这样的选项,那么也许有一个很好的惯用语 这样做的一句话?比如,使用

for...of
或类似的?

确实,有多种方法可以将 Set 转换为 Array

注意:对于 TypeScript 来说更安全。

const array = Array.from(mySet);

注意:使用 TypeScript 编译时,传播集合会出现问题(请参阅 issue #8856)。使用上面的

Array.from
来代替更安全。

const array = [...mySet];
  • 老式的方法,迭代并推入一个新数组(集合确实有
    forEach
    ):
const array = [];
mySet.forEach(v => array.push(v));

102
投票

通过 https://speakerdeck.com/anguscroll/es6-uncensored 安格斯·克罗尔

事实证明,我们可以使用

spread
运算符:

var myArr = [...mySet];

或者,也可以使用

Array.from
:

var myArr = Array.from(mySet);

18
投票

假设您只是暂时使用

Set
来获取数组中的唯一值,然后转换回数组,请尝试使用以下方法:

_.uniq([])

这依赖于使用 下划线lo-破折号


12
投票

也许参加聚会会迟到,但你可以执行以下操作:

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
投票

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

...
运算符。

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

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


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

0
投票

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

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

-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.

-2
投票

function countUniqueValues(arr) {
  return Array.from(new Set(arr)).length 

}

console.log(countUniqueValues([1, 2, 3, 4, 4, 4, 7, 7, 12, 12, 13]))

© www.soinside.com 2019 - 2024. All rights reserved.