gpt4 book ai didi

相当于 Clojure 的 "reductions"或 python 的 itertools.accumulate 的 Javascript

转载 作者:行者123 更新时间:2023-11-28 16:29:38 25 4
gpt4 key购买 nike

是否有等效于 Clojure 的“归约”函数或 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 方法来做到这一点?

最佳答案

var a = [1, 1, 1, 1];
var c = 0;
a.map(function(x) { return c += x; })
// => [1, 2, 3, 4]

a.reduce(function(c, a) {
c.push(c[c.length - 1] + a);
return c;
}, [0]).slice(1);
// => [1, 2, 3, 4]

我个人会使用第一个。

编辑:

Is there a way of doing your first suggestion that doesn't require me to have a random global variable (c in this case) floating around? If I forgot to re-initialize c back to 0, the second time I wrote a.map(...) it would give the wrong answer.

当然 - 你可以封装它。

function cumulativeReduce(fn, start, array) {
var c = start;
return array.map(function(x) {
return (c = fn(c, x));
});
}
cumulativeReduce(function(c, a) { return c + a; }, 0, [1, 1, 1, 1]);
// => [1, 2, 3, 4]
c
// => ReferenceError - no dangling global variables

关于相当于 Clojure 的 "reductions"或 python 的 itertools.accumulate 的 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33249579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com