在Javascript中提取方法链?
给定一个执行一组操作的函数在Javascript中提取方法链?,javascript,methods,chaining,Javascript,Methods,Chaining,给定一个执行一组操作的函数 const addSum = arr => arr.map(i => i+1).filter(i => i % 2 !== 0).map(i => i+1) 有没有办法提取方法链?例如,获取在对象中执行的操作树,如 {map: {filter: "map"}} 编辑:更新的示例您可以将扩展方法的名称和回调保存在二维数组中。然后使用reduce逐个调用每个函数,并在每次迭代中将结果作为累加器返回 const序列=(初始,ops)=>ops.
const addSum = arr => arr.map(i => i+1).filter(i => i % 2 !== 0).map(i => i+1)
有没有办法提取方法链?例如,获取在对象中执行的操作树,如
{map: {filter: "map"}}
编辑:更新的示例您可以将扩展方法的名称和回调保存在二维数组中。然后使用
reduce
逐个调用每个函数,并在每次迭代中将结果作为累加器返回
const序列=(初始,ops)=>ops.reduce((acc[f,cb])=>acc[f](cb),初始)
//以:[“扩展名”,回调]格式保存每个操作部件
常量运算=[
['map',i=>i+1],
['filter',i=>i%2],
['map',i=>i+2]
]
常量输出=序列([1,2,3],操作)
console.log(输出)
我不理解optput。也不是例子reduce
->map
将不起作用,因为您将缩小为一个基元,而不是一个数组,因此无法映射结果。即使reduce
给出了一个数组,结果如何与操作相对应?这些操作是连续的,没有一个是嵌套的。为什么需要这个?你想实现什么?即使这是有效的,我也不确定这能解决什么问题。你能提供一些背景吗?看,不,你不能。这些来自lambda演算,lambda演算是不可逆的。它是声明性的。一旦函数返回5,就无法知道它是如何到达那里的。另一种选择,例如量子编程,是可逆计算,可以做这样的事情()。您必须将代码解析为字符串,然后自己提取链。@sinanspd您可以使用AST解析器查看实际发生的情况。此外,可以知道每个操作将产生什么-例如,类型脚本和流,检查代码,并可以推断reduce
或map
的结果,因此可以知道转换是否是,比如说,string[]->number[]->string
或string[]->number[]->string[]
。然而,编写这样一个系统超出了SO的范围——它太宽泛了。