【问题标题】:Javascript: Restart loop once at the end of an arrayJavascript:在数组末尾重新启动循环一次
【发布时间】:2017-05-10 16:20:01
【问题描述】:

我最近遇到了这个问题,在任何地方都找不到好的答案(因此提出了这个问题)。

我想在到达终点后重新开始循环,但只循环有限的次数。

在这个特定的上下文中,我有一个星期的数组,我想使用 Date.getDay() 显示从一周中的今天开始接下来 7 天的天的名称,它返回一个从 0 开始的值(星期日) 到 6(星期六)。我可以创建一个包含接下来 7 天名称的数组,但由于当前循环,我一直跳过一个。这是我到目前为止所得到的。

我的预期输出是:

['friday', 'saturday', 'sunday', 'monday', 'tuesday', 'wednesday', 'thursday']

const dayNames = [
  "Monday",
  "Tuesday",
  "Wednesday",
  "Thursday",
  "Friday",
  "Saturday",
  "Sunday"
];
const rawDate = new Date();
let dayNum = rawDate.getDay();
const week = [];
for (let i = 0; i < 6; i++) {
  if (dayNum + 1 === 7) {
    dayNum = 0;
    for (j = 0; j < todayNum; j++) {
      week.push(dayNames[dayNum])
      dayNum++
    }
    week.push(dayNames[dayNum]);
    dayNum++
  } else {
    week.push(dayNames[dayNum + 1]);
    dayNum++;
  }

}
console.log(week);

我确实看到我的“for”中的“if”是跳过的原因,但我似乎无法弄清楚如何解决。谢谢大家

【问题讨论】:

  • 我建议更新您的示例以使用将产生预期输出的特定日期。这样,如果有人明天看到这个问题,他们仍然会得到预期的输出。你可以做const rawDate = new Date(2017, 4, 10);...
  • 您可能希望在循环之外声明一个 var 以跟踪您已完成的 forloop 数量。然后在你的循环中,一旦它等于最终的循环交互,只需将你的交互器重置为 0。当您重置交互器时,增加您的 var 跟踪您运行 for 循环的总次数。测试您的退出条件 (totalForLoops == numberOfTimeYouWantItToRun) 并在其为真时返回。
  • 我明白你在说什么,迈克。还有@Nina,这有效,但没有显示完整的 7 天......这是我的问题。
  • 哇。这么多答案!我得和 Nina 一起去,因为他们是第一个,但你没事……我需要探索模数运算符。当然。

标签: javascript loops


【解决方案1】:

您可以使用remainder operator % 作为正确的索引。

const dayNames = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
const rawDate = new Date();
let dayNum = rawDate.getDay();
const week = [];
for (let i = 0; i < 6; i++) {
    week.push(dayNames[(dayNum + i) % dayNames.length]);
}
console.log(week);

【讨论】:

  • 谢谢@Nina。当我调整循环 i &lt; 7 时,这非常有效
  • 我会尽快接受答案(5分钟)
【解决方案2】:

您不需要重新启动循环,只需使用模数运算符来包装您的数组索引。

您需要修复dayNames 的顺序,使其与getDay() 返回的内容相对应。并且循环需要运行 7 次,而不仅仅是 6 次才能获得整个星期。

const dayNames = [
  "Sunday",
  "Monday",
  "Tuesday",
  "Wednesday",
  "Thursday",
  "Friday",
  "Saturday"
];
const rawDate = new Date();
const dayNum = rawDate.getDay();
const week = [];
for (let i = dayNum; i < dayNum + 7; i++) {
  week.push(dayNames[i % 7]);
}
console.log(week);

【讨论】:

    【解决方案3】:

    尝试使用% 运算符和一个循环:

    const dayNames = [
      "Sunday",
      "Monday",
      "Tuesday",
      "Wednesday",
      "Thursday",
      "Friday",
      "Saturday"
    ];
    
    const rawDate = new Date();
    let dayNum = rawDate.getDay();
    const week = [];
    
    for (let i = 0; i < 7; i++) {
        week.push(dayNames[dayNum++ % 7]);
    }
    
    console.log(week);

    另外,根据Date.prototype.getDate,一周的第零天是星期日。

    【讨论】:

      【解决方案4】:

      如果你想要[明天,明天 + 1,...,明天 + 6]:

      for (let i = 1; i <= 7; i++) {
        week.push(dayNames[(dayNum + i) % 7]);
      }
      

      【讨论】:

        【解决方案5】:

        您需要i &lt; 7 来获取接下来的 7 天,然后使用模数运算符 % 返回除法的余数,并且单个 for 循环将为您提供所需的结果。

         const dayNames = [
          "Monday",
          "Tuesday",
          "Wednesday",
          "Thursday",
          "Friday",
          "Saturday",
          "Sunday"
        ];
        const rawDate = new Date();
        let dayNum = rawDate.getDay();
        const week = [];
        for (let i = 0; i < 7; i++) {
            week.push(dayNames[(dayNum + i) % dayNames.length]);
        }
        console.log(week);
        

        【讨论】:

          猜你喜欢
          • 2023-04-03
          • 1970-01-01
          • 2018-03-09
          • 1970-01-01
          • 2017-04-17
          • 2016-10-10
          • 2010-10-04
          • 2022-01-13
          • 1970-01-01
          相关资源
          最近更新 更多