Set似乎是一种创建具有保证唯一元素的数组的好方法,但它没有公开任何获取属性的好方法,除了生成器[Set]。值,以mySet.values.next()的尴尬方式调用。
这是可以的,如果你可以调用map和类似的函数集。但你不能这样做。
我已经尝试了Array.from,但似乎只转换类似数组(NodeList和TypedArrays ?)对象到数组。另一个尝试:Object。keys不适用于Set,而Set。原型没有类似的静态方法。
那么,问题是:是否有任何方便的内置方法来创建具有给定Set值的数组?(元素的顺序并不重要)。
如果不存在这样的选项,那么也许有一个很好的惯用的一行程序可以做到这一点?比如,用来…属于,还是类似的?
如果没有这样的选择,那么也许有一个很好的习语
只用一句话就能搞定?比如,用来…属于,还是类似的?
实际上,有几种方法可以将Set转换为Array:
使用Array.from:
注意:对于TypeScript更安全。
const array = Array.from(mySet);
简单地在数组中展开Set:
注意:在使用TypeScript编译时,展开一个Set会有问题(参见问题#8856)。使用Array.from above会更安全。
const array = [...mySet];
老式的方法,迭代并推入一个新数组(set确实有forEach):
const array = [];
mySet.forEach(v => array.push(v));
以前,使用非标准的,现在已弃用的数组理解语法:
const array = [v for (v of mySet)];
使用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));
这里有一个简单的方法,从数组中获得唯一的原始值。如果您将数组转换为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);
函数countUniqueValues(arr) {
返回Array.from(new Set(arr)).length
}
console.log(countUniqueValues([1,2,3,4,4,4,7,7,12,12,13]))