为什么可以't我用Set对象调用Array.prototype.map
Why can't I invoke Array.prototype.map with Set object
我想使用ES6的Set从某个字符串中获取唯一字符。因此,让我们假设我们有字符串var str = 'abcdeaabc';
,并从这个字符串创建一组字符:
var str = 'abcdeaadbc';
var chars = new Set(str);
现在我们有了一组独特的字符:abcd
。我很惊讶char
集合有forEach
方法而没有map
方法。
Set是可迭代的对象,为什么不能使用map
函数对Set进行迭代呢?
我试图通过以下方式将chars
集和chars.values()
集Iterator传递给Array.prototype.map
:
Array.prototype.map.call(chars, function(element) {...});
Array.prototype.map.call(chars.values(), function(element) {...});
但每一次尝试都失败了。
例如,假设我们想从字符串中获得唯一的符号,并返回一个带有前下划线的符号数组。例如:['_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);
但是有没有一种方法可以用Set
上下文调用Array.prototype的map
函数?如果没有,为什么?
Array.prototype.map
适用于具有整数索引和length
属性的类数组类型。Set
和Map
是一般的可迭代类型,但它们不是类似数组的,因此Array.prototype
方法将无法对它们起作用。例如
var s = new Set([1, 2, 3]);
s.length === undefined;
s[0] === undefined
主要的方法是Array.from
有点像您的解决方案,但需要注意的是,Array.from
将mapFn
作为第二个参数,因此您可以执行
let results = Array.from(chars, c => `_${c}`);
以获得一个漂亮而简短的映射,将可迭代映射转换为数组。
如果你绝望了,你可以这样做
var str = 'abcdeaadbc';
var chars = new Set(str);
document.write("<pre>" + JSON.stringify([...chars].map(c => c+"up")) + "</pre>")
因为即使map
足够通用,可以用于任意类似数组的对象,但并非所有可迭代对象都是类似数组的。
map
只获取length
属性,然后将属性从0
迭代到length-1
。这不能用于集合,因为它们有size
而不是length
,并且它们不提供对其元素的随机访问。
如果您真的想使用map
,则需要将集合转换为数组,然后将结果转换回集合。
var newSet = new Set(Array.from(set).map(myFunc));
但这样做没有意义,最好只使用设置操作:
var newSet = new Set();
for(let val of set) newSet.add(myFunc(val));
或者可能是一个自调用的生成器函数:
var newSet = new Set(function*() {
for(let val of set) yield myFunc(val);
}());
- 为什么可以't我用Set对象调用Array.prototype.map
- javascript 的 Set 和普通的普通对象有什么区别
- ES6 Set 允许重复数组/对象
- 将对象设置为Backbone.js模型,而不必调用“;set()"在每一处房产上
- 得到"未捕获的类型错误:未定义的不是函数“;当试图从对象调用get()或set()时
- 为什么 ECMAScript 6 包含 Set 对象,但没有提供比较它们相等的方法
- 对象属性在 chrome.storage.sync.set 之后变为 null
- 为什么我们需要在创建对象时额外放置“get”和“set”
- responseXML 显示为空,即使 xhr 对象将其显示为 set
- 在不使用.get().set()的情况下更新Ember.js中嵌套对象中的值
- Spring MVC-Set用Japascript对象填充JSTLJSP对象的内容
- mongoDB-使用$set和一个对象更新文档
- 为什么javascript's ES6/Harmony Set对象为键/值/条目方法返回空对象?
- 如何更改Raphael SET中单个对象的属性?
- EmberJS“set"对象上的方法在使用filter与Ember Data时似乎不起作用
- Can't set 'trap发送到代理对象
- 如何在Javascript (ECMAScript 6)中确定Set是否包含没有引用的对象(动态添加到Set)
- 获取具有特定键的对象数组中的所有值(set::extract cakephp等价)
- 构造对象,使其具有包含set属性方法的构造函数方法
- 在对象文字中声明空的es6-Set