实现此Javascript循环的正确方法是什么?

时间:2016-04-29 12:54:04

标签: javascript

我正在使用PHP编写日历,从服务器获取日期,使用Javascript进行前端数学运算。从服务器我使用以下值来处理:今天的日期,当前月份的天数,以及本周的位置,参考太阳到周六0-6大会。为了找到某个月的第一天,我必须从当前具有已知价值的日子开始倒退。

下面的图表显示了我正在尝试使用Javascript。一个开关就是我将pos变量改回到6(由于for循环问题而导致7),因为当我从pos减去时,我已经减去了。

enter image description here

问题在于,当for循环开始时,今天当前日的位置为5,立即减去1,直到第二天即28(之前)为止。

通过插入延迟(请参阅initialPos变量),我能够获得正确的值。这似乎不对,这样做的正确方法是什么?

这是有和没有延迟的输出的比较。

延迟:

enter image description here

毫不拖延: (没有延迟意味着我没有将1添加到todayPositionWeek,而7是6为重置pos计数器)

enter image description here

<script>
    today = 29;
    todayPositionWeek = 5;

    // start the count with todayPositionWeek shifted by 1 to not count
    var initialPos = todayPositionWeek+1;
    var numSwitches = 0;
    var loopRan = 0;
    for (var i = today; i > 0; i--) {
        loopRan++;
        // initialPos is 6
        initialPos--;
        // after it is 5 on first run
        if(initialPos == 0) {
            // reset pos counter
            initialPos = 7;
            // initially this was set to 6 but skips to 5
            numSwitches++;
        }

    firstDayPos = initialPos;

    }
    alert('loop ended ' +  firstDayPos + ' ' +  numSwitches + ' ' + loopRan);
</script>

今天没事,但是如果这一天结束了(今天不是星期五),那么转移的日子已经过去了......

enter image description here

1 个答案:

答案 0 :(得分:1)

var today = 27;
var todayPositionWeek=3;

var offset = (toDayPositionWeek+7-(today%7))%7  // ==4  because day0 ==4

function posOfAnyDay(d) {
  return (offset + d) % 7;
}
function slotOfAnyDay(d) {
  return Math.floor((offset + d) / 7);
}

//  posOfAnyDay(13)  ->  3
//  slotOfAnyDay(13)  ->  2

for (var i = today; i > 0; i--) {
  pos = posOfAnyDay(i);
  slot = slotOfAnyDay(i);
}