rimraf
rimraf

Reputation: 4126

Javascript: Restart loop once at the end of an array

I recently came across this problem and can't find a good answer anywhere (hence the question).

I want to restart the loop once i reach the end yet only loop a finite amount of times.

In this particular context I have an array of days in the week and i want to display the names of days for the next 7 days from today's day of the week using Date.getDay() ,which, returns a value from 0 (sunday) to 6 (saturday). I am able to create an array of the next 7 day names except I keep skipping one because of my current loop. Here's what i've got so far.

My expected output is:

['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);

I do see that my "if" in my "for" is the reason one is skipping but i can't seem to get my head around how to fix. Thanks y'all

Upvotes: 1

Views: 4391

Answers (5)

Don
Don

Reputation: 4192

You need i < 7 to get the entire next 7 days, then using the modulus operator % which returns the remainder of division and a single for loop will give you the desired result.

 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);

Upvotes: 0

James
James

Reputation: 22237

If you want [tomorrow, tomorrow + 1, ..., tomorrow + 6]:

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

Upvotes: 0

tavnab
tavnab

Reputation: 2734

Try using the % operator and just one loop:

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);

Also, the zeroeth day of the week, according to Date.prototype.getDate is Sunday.

Upvotes: 0

Barmar
Barmar

Reputation: 780787

You don't need to restart the loop, just use the modulus operator to wrap your array indexes around.

And you need to fix the order of dayNames so it corresponds with what getDay() returns. And the loop needs to run 7 times, not just 6 to get the entire week.

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);

Upvotes: 3

Nina Scholz
Nina Scholz

Reputation: 386550

You could use the remainder operator % for the right index.

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);

Upvotes: 4

Related Questions