【发布时间】:2016-01-19 21:01:01
【问题描述】:
是否有与 Clojure 的“reductions”函数或 Python 的 itertools.accumulate 等效的 JavaScript?换句话说,给定一个数组[x_0, x_1, x_2 ... x_n-1] 和一个函数f(prev, next),它将返回一个长度为n 的数组,其值:
[x_0, f(x_0, x_1), f(f(x_0, x_1), x_2)... f(f(f(...)), x_n)]
我在下面模拟期望的行为:
function accumsum(prev, next) {
last = prev[prev.length - 1] || 0;
prev.push(last + next);
return prev;
}
var x = [1, 1, 1, 1];
var y = x.reduce(accumsum, []);
var z = y.reduce(accumsum, []);
console.log(x);
console.log(y);
console.log(z);
显示:
[ 1, 1, 1, 1 ]
[ 1, 2, 3, 4 ]
[ 1, 3, 6, 10 ]
但我想知道是否有办法写一些更简单的东西,比如
[1, 1, 1, 1].reductions(function(prev, next) {return prev + next;});
如果没有,在 JavaScript 中是否有比我写的更惯用的方法?
【问题讨论】:
-
如果您不介意库,请查看 Underscore 它有一个 reduce 函数,应该可以完成您想做的事情
-
@jcern:这不是一个简单的 reduce(普通 JS 现在有
reduce,除非你必须支持不可提及的东西)。 -
感谢 Scott,我在 Clojure 上玩了几个星期,最终从功能性的 Kool-Aid 中喝了一大口。
标签: javascript python clojure functional-programming reduce