是否可以在 ES6 Set 实例上使用数组迭代方法

Is it possible to use array iteration methods on ES6 Set instances?

本文关键字:数组 迭代 方法 实例 ES6 Set 是否      更新时间:2023-09-26

我正在使用 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); // []

我希望结果要么是一个新的集合,要么是一个数组。我同样想使用其他数组理解方法,如filtermapreduce等。我也希望在 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)

不能直接在SetMap对象上使用Array方法。 数组方法需要.length[n]索引,这不是SetMap的工作方式。

您可以使用Array.from(s)Set转换为数组,也可以创建自己的方法直接在SetMap上运行。 如果您要经常这样做并且所需的最终结果是SetMap,那么最好不要转换为数组,修改,然后转换回来。 另外,将 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(", ") +"}");

可以为其他数组方法创建类似的方法。