Mai*_*tor 4 javascript functional-programming coffeescript livescript
nums = [2 5 3 7]
result = []
result.push {x:nums[0]}
for n in nums.slice(1)
result.push {n:n + result[-1].x}
log result
# [{x:2} {x:7} {x:10} {x:17}]
Run Code Online (Sandbox Code Playgroud)
使用该函数很难在功能上表达,map
因为每个元素都依赖于前一个元素.这个算法的正确功能解决方案是什么?
dan*_*vis 18
我知道的最简单的方法避免了性能抢夺闭包,变量,额外的函数开销和全局变量:
result= [2, 5, 3, 7].map(function(a){ return { x: this[0]+=a }; }, [0]);
Run Code Online (Sandbox Code Playgroud)
JS提供了很少使用的第二个.map()参数来存储迭代之间所需的任何状态.
它可能没有比这更简单,但不知道咖啡,对不起......
编辑:掀起了双语(js + cs)演示:http://pagedemos.com/maptranforms/
您所描述的是扫描:折叠也会返回中间结果.使用scan1
prelude.ls:
nums = [2 5 3 7]
scan1 (+), nums |> map ((num) -> { x : num })
# => [{x: 2}, {x: 7}, {x: 10}, {x: 17}]
Run Code Online (Sandbox Code Playgroud)
如果你不需要数组中的对象并且只需要添加中间结果,那么你可以完全放弃map操作并只写:
scan1 (+), [2 5 3 7] # => [2, 7, 10, 17]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
486 次 |
最近记录: |