Set 似乎是创建具有保证唯一元素的数组的好方法,但它没有公开任何获取属性的好方法,除了生成器 [Set].values,它以一种尴尬的方式调用mySet.values.next()
。
如果您可以在 Sets 上调用 map
和类似函数,那就没问题了。但你也不能那样做。
我试过 Array.from
,但似乎只将类数组(NodeList 和 TypedArrays ?)对象转换为 Array。另一个尝试:Object.keys
不适用于 Sets,并且 Set.prototype 没有类似的静态方法。
所以,问题是:是否有任何方便的内置方法来创建具有给定 Set 值的 Array ? (元素的顺序并不重要)。
如果不存在这样的选择,那么也许有一个很好的惯用单线来做到这一点?喜欢,使用 for...of
,还是类似的?
如果不存在这样的选择,那么也许有一个很好的惯用单线来做到这一点?喜欢,使用 for...of,还是类似的?
使用 Array.from:
注意:TypeScript 更安全。
const array = Array.from(mySet);
简单地将 Set 散布在一个数组中:
注意:使用 TypeScript 编译时,传播 Set 会出现问题(请参阅 issue #8856)。改用上面的 Array.from
会更安全。
const array = [...mySet];
老式的方式,迭代并推送到一个新数组(集合确实有 forEach):
const array = [];
mySet.forEach(v => array.push(v));
以前,使用非标准的,现在已弃用的数组理解语法:
const array = [v for (v of mySet)];
通过 Angus Croll 的 https://speakerdeck.com/anguscroll/es6-uncensored
事实证明,我们可以使用 spread
运算符:
var myArr = [...mySet];
或者,使用 Array.from
:
var myArr = Array.from(mySet);
Array.from
和 ...
Array.from
的浏览器。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
chrome://flags/#enable-javascript-harmony
请记住,它是实验性的,暂时不要认为这是一个很好的开发解决方案。
假设您只是暂时使用 Set
来获取数组中的唯一值,然后转换回数组,请尝试使用以下命令:
_.uniq([])
这依赖于使用 underscore 或 lo-dash。
也许迟到了,但你可以做以下事情:
const set = new Set(['a', 'b']);
const values = set.values();
const array = Array.from(values);
这应该可以在支持 ES6 的浏览器中正常工作,或者如果您有一个正确填充上述功能的 shim。
编辑:今天你可以使用@c69 的建议:
const set = new Set(['a', 'b']);
const array = [...set]; // or Array.from(set)
set.entries()
您将获得成对数组。您可以使用 set.values()
来获取普通数组。
var array = Array.from(set);
.entries
,也不需要调用 .values
。正如上面提到的@Buffalo - Array.from(set)
就足够了。
Array.from()
没有按预期工作。但是现在 spread 和 Array.from()
都可以正常工作。
使用传播运算符获得您想要的结果
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));
下面的代码从一个数组创建一个集合,然后使用 ...
运算符。
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]
这是一种从数组中仅获取唯一原始值的简单方法。如果将数组转换为 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.
我宁愿从删除数组中的重复项开始,然后尝试排序。从新数组中返回第一个元素。
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]) )
不定期副业成功案例分享
var array = [v for (v of mySet)];
在 chrome 中不起作用 46Array.from(mySet);
[...mySet]
存在问题(请参阅 this issue),因此如果您打算在不久的将来转换为 Typescript,使用Array.from(mySet)
可能更安全。