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

时间:2016-02-12 22:53:55

标签: javascript arrays set ecmascript-6

我正在使用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); // [] filtermap等。我也希望在ES6 Map实例上也有类似的行为。

这是可能的,还是我需要使用vanilla JS数组?

2 个答案:

答案 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)

您无法直接在ArraySet对象上使用Map方法。数组方法需要.length[n]索引,而不是SetMap的工作方式。

您可以使用SetArray.from(s)转换为数组,也可以创建自己的方法直接在SetMap上操作。如果你要做很多事情并且期望的最终结果是SetMap,那么最好不要转换为数组,修改然后转换回来。另外,将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方法创建类似的方法。