我正在尝试使用Javascript EC6中的新Map对象,因为它已经在最新的Firefox和Chrome版本中得到支持.
但我发现它在"功能"编程中非常有限,因为它缺乏经典的地图,过滤器等方法,可以很好地配合一[key, value]
对.它有一个forEach但不返回回调结果.
如果我可以将它map.entries()
从MapIterator转换为一个简单的数组,那么我可以使用标准.map
,.filter
没有额外的黑客攻击.
将Javascript迭代器转换为数组是否有"好"的方法?在python中它就像做一样简单list(iterator)
...但是Array(m.entries())
返回一个以Iterator为第一个元素的数组!
编辑
我忘了指定我正在寻找一个适用于地图工作的答案,这意味着至少Chrome和Firefox(Array.from在Chrome中不起作用).
PS.
我有这个递归发生器
var obj = [1,2,3,[4,5,[6,7,8],9],10]
function *flat(x) {
if (Array.isArray(x))
for (let y of x)
yield *flat(y)
else
yield 'foo' + x;
}
console.log([...flat(obj)])
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我不喜欢这for
部分.有没有办法在功能上写它?我试过了
if (Array.isArray(x))
yield *x.map(flat)
Run Code Online (Sandbox Code Playgroud)
这没用.
有没有办法在没有for
循环的情况下编写上述函数?
我有这种简单的情况,我想过滤并映射到相同的值,如下所示:
const files = results.filter(function(r){
return r.file;
})
.map(function(r){
return r.file;
});
Run Code Online (Sandbox Code Playgroud)
为了节省代码行,以及提高性能,我正在寻找:
const files = results.filterAndMap(function(r){
return r.file;
});
Run Code Online (Sandbox Code Playgroud)
这是否存在,或者我应该自己写点什么?我想在几个地方使用这样的功能,从来没有费心去研究它.
这似乎完全自然的,我认为发电机,其功能非常像数组,应该支持非常基本的列表操作,如map()
,filter()
和reduce()
。我错过了什么吗?
我为map
它编写了代码,看起来很简单,但是将所有函数嵌入所有生成器中会更好:
let fancyGen = g => {
let rv = function*() {
for (let x of g)
yield x;
}
rv.map = function*(p) {
for (let x of g)
yield p(x);
}
return rv;
}
Run Code Online (Sandbox Code Playgroud)
我是生成器的新手,因此欢迎对代码提出任何意见。特别是,这是编写“身份生成器”的最佳方式吗?