2016-07-19 11 views
0

Я пытаюсь написать функцию, которая возвращает массив одинаково распределенных дат и количества дней, относящихся к этим датам. Если оставшаяся часть этих дней будет добавлена ​​к массиву, следуйте ниже.Разделение числа на равные куски

Ожидаемые результаты:

[{ 
'startDate' : 20160719 //dates generated from momentjs 
'numOfDays': 5 
},{ 
'startDate' : 20160724 
'numOfDays': 5 
},{ 
'startDate' : 20160729 
'numOfDays': 3 
}] 

Ниже функция я написал, в которой вы можете перейти в дату начала (momentjs), общее количество дней (daysToDisplay) и количество дней, которые будут разделены по (numOfDays).

function buildQueue(startDate, numOfDays, daysToDisplay) { 
    if (!startDate || !numOfDays || !daysToDisplay) { 
     throw new Error('All params required!'); 
    } 

    var num = numOfDays > daysToDisplay ? daysToDisplay : numOfDays; 
    var div = Math.floor(daysToDisplay/num); 
    var count = daysToDisplay; 
    var rem = daysToDisplay % num; 
    var lastItem; 
    var i; 
    var arr = []; 

    for (i = 0; i <= daysToDisplay; i += num) { 

     arr.push({ 
      startDate: moment(startDate, 'YYYYMMDD').add(i, 'days').format('YYYYMMDD'), 
      numOfDays: numOfDays, 
      count: i 
     }) 

     if (rem === count) { 
      break; 
     } 

     count -= num; 

    } 

    if (count > 0) { 
     lastItem = arr[arr.length - 1]; 
     var leftover = daysToDisplay - lastItem.count; 
     arr.push({ 
      startDate: moment(lastItem.startDate, 'YYYYMMDD').add(num, 'days').format('YYYYMMDD'), 
      numOfDays: rem, 
      count: leftover + lastItem.count 
     }); 
    } 

    return arr; 

} 

Рабочий пример здесь (https://jsfiddle.net/zv5ghqpa/1/). Код, как представляется, работает в сценариях, где daysToDisplay делится более чем на 2.

Когда daysToDisplay делится только на один, мы получаем дополнительный элемент в возвращаемом массиве в основном из-за нулевого индекса в цикле for. Ожидаемый результат, если я называю buildQueue ('20160719', 5, 8) должно быть:

[{ 
    'startDate': 20160719 
    'numOfDays': 5 
}, { 
    'startDate': 20160724 
    'numOfDays': 3  
}] 

Вместо его возвращения:

[{ 
    'startDate': 20160719 
    'numOfDays': 5 
},{ 
    'startDate': 20160724 
    'numOfDays': 5 
}, { 
    'startDate': 20160729 
    'numOfDays': 3  
}] 

Я надеюсь, что я дал достаточно информации ... это действительно занимаю мою голову.

Заранее благодарим!

ответ

0

Я думаю, что это код, который вы ищете:

function buildQueue(startDate, numOfDays, daysToDisplay) { 

    if (!startDate || !numOfDays || !daysToDisplay) { 
    throw new Error('All params required!'); 
    } 

    var num = numOfDays > daysToDisplay ? daysToDisplay : numOfDays; 
    var div = Math.floor(daysToDisplay/num); 
    var count = daysToDisplay; 
    var rem = daysToDisplay % num; 
    var n = 0; 
    var i; 

    var arr = []; 

    for (i = 0; i <= daysToDisplay; i += num) { 

    arr.push({ 
     startDate: moment(startDate, 'YYYYMMDD').add(i, 'days').format('YYYYMMDD'), 
     numOfDays: daysToDisplay % num, 
     count: i 
    }) 

    console.log(rem + ' ' + count); 

    if (rem === count) { 
     count = 0; 
     break; 
    } 

    count -= num; 

    } 

    if (count > 0) { 
    var leftover = daysToDisplay - arr[arr.length - 1].count; 
    arr.push({ 
     startDate: moment(arr[arr.length - 1].startDate, 'YYYYMMDD').add(num, 'days').format('YYYYMMDD'), 
     numOfDays: daysToDisplay % num, 
     count: leftover + arr[arr.length - 1].count 
    }); 
    } 

    return arr; 

} 

//console.log(buildQueue(moment(), 80, 100)); 
console.log(buildQueue(moment(), 5, 8)); 
//console.log(buildQueue(moment(), 15, 100)); 
//console.log(buildQueue(moment(), 30, 100)); 
//console.log(buildQueue(moment(), 45, 100)); 
0

Я думаю, что «ожидаемый результат» был правильным перед редактированием вопроса. Я также отмечаю, что образец кода создал свойство count, которое вы не хотите получать.

Возможно, этот код делает то, что вы хотите?

function buildQueue(startDate, numOfDays, daysToDisplay) { 
    var arr = [] 
    while (daysToDisplay > 0) { 
     arr.push({ 
      startDate: moment(startDate, 'YYYYMMDD') 
         .add(numOfDays * arr.length, 'days') 
         .format('YYYYMMDD'), 
      numDays: Math.min(numOfDays, daysToDisplay) 
     }) 
     daysToDisplay -= numOfDays 
    } 
    return arr 
} 
Смежные вопросы