2014-10-31 2 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' на самом деле не массивы, для этого не существует штрафа за производительность. –

+0

Для не условной совокупной суммы см. Http://stackoverflow.com/questions/20477177/creating-an-array-of-cumulative-sum-in-javascript - некоторые виды структур цикла и вспомогательные функции могут быть повторно использованы , – Paul

ответ

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

+0

Ну, конечно, есть способ, это компьютер, поэтому вы просто программируете его, чтобы делать все, что хотите. Вам понадобится другая переменная для отслеживания неадресных значений, чтобы вы могли добавить их позже. –

+0

Правильно, я имел в виду, если есть способ, использующий этот метод, чтобы достичь этого :) Понравилось бы немного дальнейшего руководства, довольно нового с JavaScript. Еще раз спасибо. – GimelG

1

Для петель очень быстро в 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' и разветвить эти два случая.

Смежные вопросы