将数字除以相等的块

时间:2016-07-19 12:45:04

标签: javascript arrays loops

我正在尝试编写一个函数,该函数返回一组与这些日期相关的同等分块日期和天数。如果有剩余的那些日子,它们会被附加到数组中,如下所示。

预期结果:

[{
'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(&#39; 20160719&#39;,5,8),预期的结果应该是:

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

而是返回:

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

我希望我已经提供了足够的信息......这真的是我的目标。

提前致谢!

2 个答案:

答案 0 :(得分:0)

我认为这是您正在寻找的代码:

m = size(P, 1);
n = size(R, 1);
C = false(m, n);
for i=1:n
    C(:, i) = (P(:, 1)>=R(i, 1))&(P(:, 1)<=R(i, 3))& ...
        (P(:, 2)>=R(i, 2))&(P(:, 2)<=R(i, 4));
end

答案 1 :(得分: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
}