【发布时间】:2017-05-23 08:19:51
【问题描述】:
如果我有一个数组someArray,我首先要对其进行一些操作,然后将该结果传递给一个函数arrfun,该函数将数组作为参数。像下面这样
let arr = someArray.filter(foo).map(bar)
let result = arrfun(arr)
在上面的场景中,我想避免必须分配一个中间变量来传递给arrfun。我想要这样的东西。
Object.prototype.pipe = function(f) {return f(this)}
let result = someArray.filter(foo).map(bar).pipe(arrfun)
- 代替
.pipe(),您将如何解决这个问题? - 将该功能引入
Object是否明智? -
pipe是此类函数的最佳名称吗?chain?pass?
新示例
const pc = options => options
.join(' ')
.match(/--[\w.]* [\w.]*/g)
.map(s => s.slice(2).split(' '))
.map(([key, value]) => ({key, value}))
.map(nestObject)
.reduce((acc, val) => Object.assign(acc, val), {})
const nestObject = ({key, value}) => key
.split('.')
.reverse()
.reduce((inner, key) => ({[key]: inner}), value)
在上面的示例中,如果没有找到匹配项,.match 会返回 null。使用 .pipe 你可以解决它 ny 将该行更改为
.pipe(s => s.match(/--[\w.]* [\w.]*/g) || [])
如果没有pipe,你会如何解决这个问题?
【问题讨论】:
-
arrfun(someArray.filter(foo).map(bar))有什么问题? -
如果你真的想在
Object.prototype上引入新方法,至少do it properly(但不是,it's not sensible)。 -
chain有不同的含义 -
(options.join(…).match(…) || []).map(…).…有什么问题? -
因为,在我看来,包装这样的东西并不能提高可读性。我认为在这个例子中,被包装的东西已经很大了,想象有更多的包装器。只是链接东西要简单得多。
标签: javascript functional-programming