如何将Set转换为Array?

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

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

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

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

如果不存在这样的选项,那么也许有一个很好的惯用一行代码可以做到这一点?比如,使用for...of或类似的?

452332 次浏览

如果没有这样的选项存在,那么也许有一个很好的惯用语 这样做的单行?比如,使用for...of,还是类似的?

实际上,有几种方法可以将设置转换为数组

注意:TypeScript更安全。

const array = Array.from(mySet);

注意:使用TypeScript编译时传播Set会出现问题(请参阅问题#8856)。使用上面的Array.from更安全。

const array = [...mySet];
  • 老式的方式,迭代并推送到一个新数组(Sets确实有forEach):
const array = [];
mySet.forEach(v => array.push(v));
  • 以前,使用非标准且现在已弃用的数组理解语法:
const array = [v for (v of mySet)];

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

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

var myArr = [...mySet];

或者,或者,使用Array.from

var myArr = Array.from(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)

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

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

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

在IE11下工作。

使用设置并将其转换为数组非常类似于复制数组。

因此,您可以使用相同的方法复制数组,这在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));

这是一个从数组中仅获取唯一原始值的简单方法。如果您将数组转换为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.

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

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

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


}


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

做这件事的简单方法

 const array = [...new Set([1,1,2,3,3,4,5])]
console.log(array)