为什么我不能用Set对象调用Array.prototype.map

Yur*_*kym 4 javascript arrays set ecmascript-6

我希望使用ES6的Set从某些字符串中获取唯一字符.所以我们假设我们有字符串var str = 'abcdeaabc';并从这个字符串创建一组字符:

var str = 'abcdeaadbc';
var chars = new Set(str);
Run Code Online (Sandbox Code Playgroud)

现在我们有了一组独特的角色:abcd.我很惊讶charset有forEach方法而且没有map方法.

Set是可迭代对象,为什么我们不能使用map函数迭代set?

我试图以这种方式传递charsset和chars.values()SetIterator Array.prototype.map:

Array.prototype.map.call(chars, function(element) {...});
Array.prototype.map.call(chars.values(), function(element) {...});
Run Code Online (Sandbox Code Playgroud)

但每次尝试都失败了.

例如,假设我们想从string中获取唯一符号并返回前面下划线的数组.例如.:['_a', '_b', '_c', '_d']

这是我的两个解决方案:

// First:
var result = Array.from(chars).map(function(c) {
    return '_' + c;
});

// Second:
var result = [];
chars.forEach(function(c) {
    this.push('_' + c);
}, result);
Run Code Online (Sandbox Code Playgroud)

但是有没有办法mapSet上下文调用Array.prototype的函数?如果没有 - 为什么?

log*_*yth 5

Array.prototype.map适用于具有整数索引和length属性的类数组类型.Set并且Map是一般可迭代类型,但它们不是类似数组的,因此Array.prototype方法不适用于它们.例如

var s = new Set([1, 2, 3]);
s.length === undefined;
s[0] === undefined
Run Code Online (Sandbox Code Playgroud)

主要方法Array.from有点像你的解决方案,但有一点需要注意的是,Array.from将a mapFn作为第二个参数,所以你可以这样做

let results = Array.from(chars, c => `_${c}`);
Run Code Online (Sandbox Code Playgroud)

一个漂亮的短地图将迭代转换为数组.