我正在使用ES6 Set实例,我需要对它们应用一些转换。这些是转换,如果它们是数组就很简单。这是一个例子:
td
我希望结果可能是新的Set或数组。我同样想要使用其他数组理解方法,如let s = new Set;
s.add(1);
s.add(2);
s.add(3);
let n = s.filter(val => val > 1); // TypeError, filter not defined
let n = Array.prototype.filter.call(s, val => val > 1); // []
,filter
,map
等。我也希望在ES6 Map实例上也有类似的行为。
这是可能的,还是我需要使用vanilla JS数组?
答案 0 :(得分:6)
您可以使用
获取数组中s的值Array.from(s.values())
Array.from documentation表示它从类似数组或可迭代的对象创建一个新的Array实例。
Set.values返回一个新的Iterator对象,该对象包含插入顺序中Set对象中每个元素的值。
所以你的代码变成了
let s = new Set;
s.add(1);
s.add(2);
s.add(3);
let n = Array.from(s.values()).filter(val => val > 1)
答案 1 :(得分:1)
您无法直接在Array
或Set
对象上使用Map
方法。数组方法需要.length
和[n]
索引,而不是Set
或Map
的工作方式。
您可以使用Set
将Array.from(s)
转换为数组,也可以创建自己的方法直接在Set
或Map
上操作。如果你要做很多事情并且期望的最终结果是Set
或Map
,那么最好不要转换为数组,修改然后转换回来。另外,将Map转换为数组并不是那么简单,因为你同时拥有键和值(可能必须是一个对象数组)。
例如,您可以为.filter()
对象创建自己的Set
方法,如下所示:
Set.prototype.filter = function(fn) {
let result = new Set();
for (let val of this) {
if (fn(val, this) === true) {
result.add(val);
}
}
return result;
}
let s = new Set;
s.add(1);
s.add(2);
s.add(3);
let n = s.filter(val => val > 1);
// log the output
// log output
document.write("Set {" + Array.from(n).join(", ") +"}");
可以为其他Array方法创建类似的方法。