在 Javascript 中提取方法链?
Extract a method chain in Javascript?
给定一个执行一组操作的函数
const addSum = arr => arr.map(i => i+1).filter(i => i % 2 !== 0).map(i => i+1)
有没有办法提取方法链?例如,获取在
这样的对象中执行的操作的树
{map: {filter: "map"}}
编辑:更新示例
您可以将扩展方法的名称和回调保存在二维数组中。然后使用 reduce
一个一个地调用每个函数, return 每次迭代的结果作为累加器
const sequence = (initial, ops) => ops.reduce((acc, [f, cb]) => acc[f](cb), initial)
// Save each opeartion in: ["extension name", callback] format
const operations = [
['map', i => i + 1],
['filter', i => i % 2],
['map', i => i + 2]
]
const output = sequence([1, 2, 3], operations)
console.log(output)
或者,您可以使用函数模式
中使用的pipe
函数
const increment = n => arr => arr.map(i => i + n)
const evenFilter = arr => arr.filter(i => i % 2)
function pipe(...fns) {
return arg => fns.reduce((prev, fn) => fn(prev), arg);
}
console.log(
pipe(increment(1), evenFilter, increment(2))([1, 2, 3])
)
给定一个执行一组操作的函数
const addSum = arr => arr.map(i => i+1).filter(i => i % 2 !== 0).map(i => i+1)
有没有办法提取方法链?例如,获取在
这样的对象中执行的操作的树{map: {filter: "map"}}
编辑:更新示例
您可以将扩展方法的名称和回调保存在二维数组中。然后使用 reduce
一个一个地调用每个函数, return 每次迭代的结果作为累加器
const sequence = (initial, ops) => ops.reduce((acc, [f, cb]) => acc[f](cb), initial)
// Save each opeartion in: ["extension name", callback] format
const operations = [
['map', i => i + 1],
['filter', i => i % 2],
['map', i => i + 2]
]
const output = sequence([1, 2, 3], operations)
console.log(output)
或者,您可以使用函数模式
中使用的pipe
函数
const increment = n => arr => arr.map(i => i + n)
const evenFilter = arr => arr.filter(i => i % 2)
function pipe(...fns) {
return arg => fns.reduce((prev, fn) => fn(prev), arg);
}
console.log(
pipe(increment(1), evenFilter, increment(2))([1, 2, 3])
)