是否可以在 ES6 Set 实例上使用数组迭代方法
Is it possible to use array iteration methods on ES6 Set instances?
我正在使用 ES6 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
、reduce
等。我也希望在 ES6 Map 实例上也有类似的行为。
这是可能的,还是我需要使用原版JS数组?
您可以使用以下命令获取数组中 s 的值
Array.from(s.values())
Array.from 文档指出,它从类似数组或可迭代的对象创建新的 Array 实例。
Set.values 返回一个新的迭代器对象,该对象包含 Set 对象中每个元素的值(按插入顺序)。
所以你的代码变成了
let s = new Set;
s.add(1);
s.add(2);
s.add(3);
let n = Array.from(s.values()).filter(val => val > 1)
不能直接在Set
或Map
对象上使用Array
方法。 数组方法需要.length
和[n]
索引,这不是Set
或Map
的工作方式。
您可以使用Array.from(s)
将Set
转换为数组,也可以创建自己的方法直接在Set
或Map
上运行。 如果您要经常这样做并且所需的最终结果是Set
或Map
,那么最好不要转换为数组,修改,然后转换回来。 另外,将 Map 转换为数组并不是那么简单,因为您同时拥有键和值(可能必须是对象数组)。
例如,您可以为Set
对象创建自己的.filter()
方法,如下所示:
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(", ") +"}");
可以为其他数组方法创建类似的方法。
相关文章:
- 使用嵌入式数组迭代JSON
- 节点.js异步数组迭代
- jQuery 数组迭代
- Javascript:(ES5)数组迭代的权威指南
- Javascript 数组迭代
- JavaScript 数组迭代方向
- 是否可以在 ES6 Set 实例上使用数组迭代方法
- Javascript 中的数组迭代问题
- javascript 2D数组迭代返回未定义的函数参数
- 返回数组迭代
- 这对于数组元素上的简单数组迭代操作来说是最有效的
- 数组迭代陷阱
- JavaScript数组-迭代问题
- JavaScript For循环数组迭代问题-使用一个循环与两个循环
- 如何克服javascript数组迭代跳过记录/秒
- 将数组迭代到自定义网格中
- 在Node.JS中跨数组迭代save
- 数据可见性的数组迭代- javascript
- 在数组迭代中迭代对象键
- 使用数组迭代对象属性