Javascript 如何将集合转换为数组?
Set似乎是创建具有保证的唯一元素的数组的好方法,但除了generator[Set].values之外,它没有公开任何获取属性的好方法,而generator[Set].values是以一种笨拙的方式调用的Javascript 如何将集合转换为数组?,javascript,arrays,collections,syntax,ecmascript-harmony,Javascript,Arrays,Collections,Syntax,Ecmascript Harmony,Set似乎是创建具有保证的唯一元素的数组的好方法,但除了generator[Set].values之外,它没有公开任何获取属性的好方法,而generator[Set].values是以一种笨拙的方式调用的mySet.values.next() 如果您可以调用集合上的map和类似函数,这就可以了。但你也不能这么做 我尝试了Array.from,但似乎只将类似数组(NodeList和TypedArrays?)的对象转换为数组。另一次尝试:Object.keys不适用于Set,Set.prototyp
mySet.values.next()
如果您可以调用集合上的map
和类似函数,这就可以了。但你也不能这么做
我尝试了Array.from
,但似乎只将类似数组(NodeList和TypedArrays?)的对象转换为数组。另一次尝试:Object.keys
不适用于Set,Set.prototype没有类似的静态方法
因此,问题是:是否有任何方便的内置方法来创建具有给定集合的值的数组?(元素的顺序实际上并不重要)
如果不存在这样的选项,那么可能有一个很好的惯用单行程序来实现这一点?例如,使用<代码>作为的…或类似的
如果不存在这样的选项,那么可能有一个很好的习惯用法
做那件事要一个班轮吗?例如,用于……的,或类似的
实际上,有几种方法可以将a转换为:
使用
简单地说,数组中的
旧式的方法,迭代并推送到一个新数组(集合确实有forEach
)
以前,使用非标准且现在已弃用的数组理解语法:
安格斯·克罗尔via酒店
事实证明,我们可以使用spread
操作符:
var myArr = [...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)
使用spread运算符获得所需的结果
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));
下面是一种从数组中仅获取唯一原始值的简单方法。如果将数组转换为集合,则在此之后,执行从集合到数组的转换。此转换仅适用于原始值,对于数组中的对象无效。你自己试试看
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]);
为什么要投否决票?这种方法有什么问题吗?或者有人试图在IE11中执行此代码,但失败了?;)我没有投反对票,但我在最新版本的Chrome中尝试了这一点,但失败了,所以这不仅仅是IE的问题。请参阅,以获得或多或少最新的支持图表。目前,在所有桌面浏览器中,只有FF和IE TP(又名Spartan,又名MS非IE浏览器)支持
数组。from
和。
看起来Firefox是唯一支持数组的浏览器。from
。在这里,您可以为Chromechrome://flags/#enable-javascript harmony
记住它是实验性的,暂时不要认为这是一个很好的开发解决方案。这在Safari(8)或Chrome(41)中不起作用。但是它在Firefox(35)中也能工作代码>在46中不起作用我认为最优雅的方式就是[…mySet]
@WojciechBednarski l33t不优雅。如果其中任何一个例子是这样的,那么它就是Array.from(mySet)
只是想补充一点,[…mySet]
在使用Typescript编译时存在问题(请参阅),因此如果您打算在不久的将来转换为Typescript,使用数组(从(mySet)
可能会更安全。似乎使用set.entries()
可以获得对数组。您可以使用set.values()
来获取普通数组。@ShimonRachlenko true,用户确实要求这样做。您只需使用var array=array.from(set)这个答案是错的。您不需要调用.entries
,也不需要调用.values
。正如上面提到的@Buffalo-Array.from(set)
就足够了。@c69是这样的。在回答此问题时,Array.from()
未按预期工作。但是现在spread和Array.from()
都可以正常工作。不幸的是,这是唯一的cross broser解决方案。这是什么?
const b = [];
a.forEach(v => b.push(v));
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 ]
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]);