2015-02-05 6 views
0

Я пытаюсь получить сумму итогов на основе квартальной системы. [10,20,30,40,50,60,70,80,90] - Initial массивРасчет суммы на основе кварталов

В результате я ищу это [60, 150, 70, 80, 90] Где Q1 = 10+20+30 = 60 Q2 = 40+50+60 = 150 Q3 будет завершена только если передача стоимости октября.

Я путать с логикой у меня есть

var adata = [10,20,30,40,50,60,70,80,90]; 
 
process(adata, "Sept 2014"); 
 

 
function process(adata, date){ 
 
    var today = new Date(date) || new Date(); 
 
    var aQuarter = []; 
 
\t var tempQuarter = []; 
 
    var aSum = []; 
 
    //var quarter = Math.floor((today.getMonth() + 3)/3); 
 
    for(var i = 0; i<= today.getMonth(); i++) { 
 
     aQuarter.push(adata[i]); 
 
    } 
 
    tempQuarter = adata.slice(); 
 
    if(tempQuarter.length > 3) { 
 
\t \t var i = 0; 
 
     var sum = []; 
 
\t \t while(i <= 2) { 
 
\t \t \t sum[i] = aQuarter.shift(); 
 
\t \t \t i++; 
 
\t \t } 
 
     console.log(sum); 
 
\t \t aQuarter.unshift(sum); 
 
\t } 
 
    if(tempQuarter.length > 6){ 
 
\t \t var i = 0; 
 
     var sum = []; 
 
\t \t while(i+1 <= 3) { 
 
\t \t \t sum[i] = aQuarter.shift(); 
 
\t \t \t i++; 
 
\t \t } 
 
\t \t aQuarter.unshift(sum); 
 
\t } 
 
    console.log(aQuarter); 
 
    if(tempQuarter.length > 9){ 
 
\t \t var i = 0; 
 
\t \t while(i+2 <= 4) { 
 
\t \t \t sum[i] = aQuarter.shift(); 
 
\t \t \t i++; 
 
\t \t } 
 
\t } 
 
}

jsfiddle

+0

Вы говорите, что результат должен быть .. '[60, 150, 80, 80, 90]'. Разве вы не подразумеваете '[60, 150, 70, 80, 90]'? – Bijan

+0

извините, мой плохой. Я имел в виду '[60, 150, 70, 80, 90]'. Обновлено! – user525146

ответ

1

К сожалению играл с немного доделать и получил это, чтобы получить результаты, он будет работать ты?

var adata = [10,20,30,40,50,60,70,80,90]; 
console.log("Sept 2014"); 
process(adata, "Sept 2014"); 

console.log("April 2014"); 
process(adata, "April 2014"); 

console.log("March 2014"); 
process(adata, "March 2014"); 

console.log("December 2014"); 
process(adata, "December 2014"); 

function process(adata, date){ 
    var today = new Date(date) || new Date(); 

    // reults array init 
    var tempArray = []; 
    var eachQuarterAmount = 3; 
    // Limit the values to January to today as defined by the date param 
    var aDataUpToPoint = adata.slice(0,today.getMonth() + 1); 
    console.log(aDataUpToPoint); 

    for (var i = 0; i < aDataUpToPoint.length; i+=eachQuarterAmount) { 
    // increment every 3 values 

     if (typeof aDataUpToPoint[i+eachQuarterAmount] != 'undefined') { 
      // If there's anything after (ie if there's Oct) then total previous values up using reduce 
      tempArray.push(aDataUpToPoint.slice(i,i+eachQuarterAmount).reduce(function(total, num){ return total + num },0)); 
     } else { 
      // If the hunt for red October failed just tack on whatever remains 
      for (; i < aDataUpToPoint.length; i++) { 
       // uses the same loop contol variable as the parent to complete the search in both cases, picks up where it left off 
       tempArray.push(aDataUpToPoint[i]); 
      } 
     } 
    } 
    console.log(tempArray); 
} 

Редактировать: уменьшить количество магических чисел ... sorta.

Примечание: Просто понял, что вы делаете что-то с датой парами ... так на самом деле мой adata.length, вероятно, следует заменить today.getMonth()

Edit 2: нарезанный ADATA вниз, чтобы работать в диапазоне дат, добавил +1 к набору данных и удалил +1 из перспективы.

+0

Спасибо, это именно то, что я ищу, работает как шарм – user525146

+0

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

+0

Я обновил код до 'today.getMonth()', что дает мне разные результаты в разных случаях, 'http: // jsfiddle.net/8f2k679x /' – user525146

1

У меня есть немного более короткая версия с циклом, чтобы суммировать стоимость квартала. Неиспользуемые элементы конкатенируются в конце.

var adata = [10,20,30,40,50,60,70,80,90]; 
process(adata, "Sept 2014"); 

function process(adata, date) { 
    var today = new Date(date) || new Date(); 
    var QUOTER = 3; 
    var month = today.getMonth(); 
    var limit = (month > adata.length) ? adata.length : month; 
    var aQuarter = []; // quater sum array 
    var sum = 0;  // gather sum for each quarter 
    for (var i=0; i < limit; i++) { 
    sum += parseInt(adata[i]); 
    if ((i+1) % QUOTER == 0) { 
     aQuarter.push(sum); 
     sum = 0; 
    } 
    } 
    var usedElements = aQuarter.length * QUOTER; 
    if (adata.length > usedElements) 
    aQuarter = aQuarter.concat(adata.slice(usedElements)); 

    console.log("On " + today + " the sums are " + aQuarter); 
} 

Здесь DEMO, в котором вы можете играть с настройкой даты.

+0

работает как ожидалось , спасибо за упрощенную версию – user525146

+0

Я пытаюсь создать таблицу с именами столбцов с аналогичной логикой выше.У меня есть этот код, 'http: // jsfiddle.net/q8ftcj57 /'. Может ли это быть еще более упрощенным? – user525146

+1

Вам нужно что-то вроде этого: http://jsfiddle.net/7uxx802o/6/ – MaxZoom

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