Я пытаюсь написать функцию, которая возвращает массив одинаково распределенных дат и количества дней, относящихся к этим датам. Если оставшаяся часть этих дней будет добавлена к массиву, следуйте ниже.Разделение числа на равные куски
Ожидаемые результаты:
[{
'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
}]
Я надеюсь, что я дал достаточно информации ... это действительно занимаю мою голову.
Заранее благодарим!