Ser*_*aev 57 javascript functional-programming
flatMap
对集合非常有用,但javascript不提供Array.prototype.map
.为什么?
有没有办法flatMap
在javascript中以简单有效的方式模拟,无需flatMap
手动定义?
Tha*_*you 72
为什么javascript中没有Array.prototype.flatMap?
因为编程不是魔术,每种语言都没有其他语言所具有的特征/原语
重要的是
JavaScript使您能够自己定义它
const data =
[ 1, 2, 3, 4 ]
console.log(data.flatMap(x => Array(x).fill(x)))
// [ 1, 2, 2, 3, 3, 3, 4, 4, 4, 4 ]
Run Code Online (Sandbox Code Playgroud)
或者重写将两个循环折叠成一个循环
const concat = (x,y) =>
x.concat(y)
const flatMap = (f,xs) =>
xs.map(f).reduce(concat, [])
const xs = [1,2,3]
console.log(flatMap(x => [x-1, x, x+1], xs))
Run Code Online (Sandbox Code Playgroud)
如果你想要它Array.prototype.flatMap
,没有什么能阻止你
const flatMap = (f,xs) =>
xs.reduce((acc,x) =>
acc.concat(f(x)), [])
const xs = [1,2,3]
console.log(flatMap(x => [x-1, x, x+1], xs))
Run Code Online (Sandbox Code Playgroud)
更新:Array.prototype
它是原生ECMAScript的方式.它目前处于第3阶段.
Kut*_*yel 43
我认为这是一个伟大的时刻宣布,flatMap
已提出向TC39
并且还给出了我的方法实现(更像2017年;)
[1, 3].flatMap(x => [x, x + 1]) // > [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
请享用!
编辑:实际上,正确地知道它在第3阶段,因此很有可能进入下一个ES版本
Ala*_*mms 10
我知道你说你不想自己定义它,但这个实现是一个非常简单的定义.
在同一个github页面上也有这个:
这里有一些使用es6 spread的简短方法,类似于renaudtertrais - 但是使用es6而不是添加到原型中.
var flatMap = (a, cb) => [].concat(...a.map(cb))
const s = (v) => v.split(',')
const arr = ['cat,dog', 'fish,bird']
flatMap(arr, s)
Run Code Online (Sandbox Code Playgroud)
这些都有帮助吗?
应该注意(感谢@ftor)如果在非常大的(例如,300k元素)阵列上调用,后一种"解决方案"会遭受"超出最大调用堆栈大小" a
.
Lodash提供了一个平面图功能,对我来说实际上相当于本机提供它的Javascript.如果你不是Lodash用户,那么ES6的Array.reduce()
方法可以给你相同的结果,但你必须以不连续的步骤进行map-then-flatten.
下面是每个方法的示例,映射整数列表并仅返回赔率.
Lodash:
_.flatMap([1,2,3,4,5], i => i%2 !== 0 ? [i] : [])
Run Code Online (Sandbox Code Playgroud)
ES6减少:
[1,2,3,4,5].map(i => i%2 !== 0 ? [i] : []).reduce( (a,b) => a.concat(b), [] )
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
40653 次 |
最近记录: |