2014-10-31 144 views
1

我需要执行一个数组的累加和。在某些情况下,我需要它是直线前进,并发现该片段到伟大的工作:数组的累积和,在另一个数组中的条件

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); 

当我登录“cumul”我得到的结果,我需要。但是,在其他IF()条件下,我需要执行累计总和,以在包含日期的另一个数组中提供某个条件 - 如果日期为< = X,则不要在此迭代中添加累计总和累计值)。

任何想法如何实现?似乎使用这个累积和的版本是行不通的,但我不确定会有什么其他方法可以解决这个问题。

在此先感谢! G

+0

我的第一个建议是,你凝结两个数据结构合而为一。 'var arr = [{val:7,date:'2014-10-31'},{val:3,date:'2014-11-01'}]'然后遍历一个数据结构。由于'javascript'数组并不是真正的数组,因此这样做不会有性能损失。 – 2014-10-31 10:49:42

+0

对于非条件累积和,请参阅http://stackoverflow.com/questions/20477177/creating-an-array-of-cumulative-sum-in-javascript - 可能重用某些循环结构和辅助函数。 – Paul 2014-10-31 11:05:15

回答

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; } 
+0

这将返回[1,3,3,7,12]。有没有一种方法让函数跳过给定迭代中的值,但如果它符合标准则在下一个计算它呢?例如,在这个例子中,我想这是结果:[1,3,3,10,15]。谢谢! – GimelG 2014-10-31 14:51:05

+0

当然有一种方法,它是一台电脑,所以你只要编程就可以做任何你想做的事情。您需要另一个变量来跟踪未添加的值,以便稍后将其添加回来。 – 2014-10-31 16:40:04

+0

对,我的意思是如果有一种方法使用这种方法来实现这一点:)希望有进一步的指导,相当新的JavaScript。再次感谢。 – GimelG 2014-10-31 16:58:35

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'并分支这两种情况。