Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实现此Javascript循环的正确方法是什么?_Javascript - Fatal编程技术网

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

实现此Javascript循环的正确方法是什么?,javascript,Javascript,我正在使用PHP从服务器获取日期,并使用Javascript进行前端计算。在服务器上,我使用以下值来处理:今天的日期、当前月份的天数,以及参考Sun-to-Sat 0-6约定的一周中今天的位置。为了找到一个月的第一天,我必须从已知值的当天开始向后工作 下面的图表显示了我试图用Javascript做什么。当我从pos中减去时,当我点击0时,当我将pos变量更改回6(由于for循环问题为7)时,会出现一个开关 问题是,当for循环开始时,今天的当前日期的位置(即5)会立即减去1,而这应该是在第二天

我正在使用PHP从服务器获取日期,并使用Javascript进行前端计算。在服务器上,我使用以下值来处理:今天的日期、当前月份的天数,以及参考Sun-to-Sat 0-6约定的一周中今天的位置。为了找到一个月的第一天,我必须从已知值的当天开始向后工作

下面的图表显示了我试图用Javascript做什么。当我从pos中减去时,当我点击0时,当我将pos变量更改回6(由于for循环问题为7)时,会出现一个开关

问题是,当for循环开始时,今天的当前日期的位置(即5)会立即减去1,而这应该是在第二天(即前一天)之前

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

这里是有延迟和无延迟输出的比较

延迟:

立即: (毫不延迟地表示我没有将1添加到todayPositionWeek,7表示重置pos计数器为6)


今天=29;
今天位置周=5;
//开始计数时,todayPositionWeek被1移位为not count
var initialPos=今日职位周+1;
var numSwitches=0;
var-loopRan=0;
对于(var i=today;i>0;i--){
loopRan++;
//起始位置是6
首字母pos--;
//在第一次跑步时是5点之后
if(initialPos==0){
//重置pos计数器
初始位置=7;
//最初设置为6,但跳过5
numSwitches++;
}
firstDayPos=initialPos;
}
警报('循环结束'+firstDayPos+''+numSwitches+''+loopRan);
今天很好,但是如果今天休息(今天不是星期五),那么换班的日子就休息了


不太清楚您在这里想做什么。您不能使用javascript的内置日期类吗。使用起来有点基本/烦人,但在这里它可能会满足您的目的。或者你可以使用某种整数算法(mod、floor等)?@dan man,我已经展示了我要做的,图表就是我要完成的。PHP根据今天的日期给了我一些已知的值。我正在确定要在日历中填充的值。问题是循环不是直接的,我必须通过添加一个“延迟”来编辑它,因为for循环是如何运行的。这现在起作用了,做得很好,我说这很糟糕,这是不对的。这是一个“黑客”或一堆废话。这也是一个完整的日历,不仅仅是今天的日期。我还是不太明白,但你不是在做类似
(a-b)%7
?这似乎是个X/Y问题。您是否正在尝试设置日历(如正常的5-6周7天网格)?你想要的结果是什么?我想我会采取不同的方法。找出一个月的第一天是一周中的哪一天,然后向后循环直到找到一个星期天(除非你从一天开始),然后向前循环直到该月最后一天之后的星期六(或等于)。你需要两个循环,但它们应该更容易编写。我现在太迷茫了,只是在看我自己的代码,我甚至不确定你的代码。无意冒犯,我只是说我不能理解,甚至不知道我在问什么,但谢谢你的回答。
<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>
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);
}