我需要执行一个数组的累积和。在某些条件下,我需要它直截了当,并发现这个片段工作得很好:
cumul = sum.reduce(function (a, n) {
a.push((a.length > 0 ? a[a.length-1] : 0) + n);
return a;
}, [initial]);
cumul.shift();
Logger.log(cumul);
当我登录&cum;'我得到了我需要的结果。但是,在其他IF()条件下,我需要执行累积和,在另一个包含日期的数组中提供某个条件 - 如果日期是< = X,则不要在此迭代中添加累积和(显示以前的累计值)。
任何想法如何实现?似乎使用这个版本的累积金额不会起作用,但我不确定会有什么其他方法可以解决这个问题。
提前致谢! ģ
答案 0 :(得分:1)
For循环在Javascript中非常快,可以创建各种类型 条件总和。
下面的函数ccSum()有2个参数,一个数据数组和一个条件数组。 如果条件为真,则对数据求和。
function ccSum(data, condition){
var r = [];
r[0] = (condition[0])? data[0]: 0;
for(i=1,l=data.length; i<l; ++i) r[i] = r[i-1] + ( (condition[i])? data[i]: 0 );
return r
}
通过更改第一轮condition[i]
的方括号condition(i)
,可以很容易地重写此条件,其中条件是要调用的函数。或者,我们可以检查typeof(condition)==='function'
并分支这两种情况。
答案 1 :(得分:1)
你在推动,减少和转移的过程中,对自己的生活太过艰难。
function running_total(array, init) {
return array
.map(function(v, i) { return v ===3 ? 0 : v; }) // filter out 3's
.map(function(v) { return init += v; })
;
}
document.writeln(running_total([1,2,3,4,5], 0));
要使过滤器属于另一个并行的日期数组,请将第一个地图函数更改为
之类的内容function(v, i) { return dates[i] < cutoff ? 0 : v; }