什么是这个循环的功能型替代品?

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/

  • `result = [2,5,3,7] .map((a) - > x:@ [0] + = a),[0]` (2认同)

Noa*_*tas 8

您所描述的是扫描:折叠也会返回中间结果.使用scan1prelude.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)

scan1文件.