FizzBuzz into array with javascript into an array not working properly

47 views Asked by At

This is my first question so sorry if it's dumb. I'm trying to do the classic FizzBuzz exercise in the console using javascrypt, putting the changes into an array for 1 to 100. So far:

let nums = [];

for (let i = 1; i <= 100; i++) {
    nums.push(i);
}

for (num of nums) {
    if (nums[num] % 5 === 0) {
        nums[num] = "Buzz";
        console.log("Buzz");
    }
    else if (nums[num] % 3 === 0) {
        nums[num] = "Fizz";
        console.log("Fizz");
    }
    else if (nums[num] % 3 === 0 && nums[num] % 5 === 0) {
        nums[num] = "FizzBuzz";
        console.log("FizzBuzz");
    }
    else {
        console.log(nums[num]);
    }

}

I'm expecting each FizzBuzz to be put into the array instead of the number, and all the array to be printed on the console. But for some specific numbers it doesn't work. When two vales need to be changed consequently, the second one gives some kind of error. What am i missing?

Thanks for your help!

2

There are 2 answers

0
fdomn-m On BEST ANSWER

The issue is that you're counting starts at 1, and you're using that number as an index. First entry in the array is nums[0] but you're using nums[num] where num==1 so you're getting nums[1] as the first entry.

So first entry is:

num == 1
nums[1] == 2  // as nums[0] == 1

then next

num == 2
nums[2] == 3, so replace with Fizz

now next entry in the array is nums[2] (0,1 above) and nums[2] == Fizz (replaced above)

num == "Fizz"
nums["Fizz"] == undefined
0
jabaa On

The loop

for (num of nums) {

iterates over the elements of the array nums and

nums[num]

uses the elements as index for the same array. That doesn't make sense. Instead iterate over the indices with num in nums and use them as indices.

const nums = [];

for (let i = 1; i <= 100; i++) {
    nums.push(i);
}

for (const num in nums) {
    if (nums[num] % 3 === 0 && nums[num] % 5 === 0) {
        nums[num] = "FizzBuzz";
        console.log("FizzBuzz");
    }
    else if (nums[num] % 3 === 0) {
        nums[num] = "Fizz";
        console.log("Fizz");
    }
    else if (nums[num] % 5 === 0) {
        nums[num] = "Buzz";
        console.log("Buzz");
    }
    else {
        console.log(nums[num]);
    }

}

In addition, I changed the order of the conditions. If nums[num] % 3 === 0 && nums[num] % 5 === 0 is true, either nums[num] % 3 === 0 or nums[num] % 5 === 0 is true. That means, the condition nums[num] % 3 === 0 && nums[num] % 5 === 0 is unreachable. You don't have any FizzBuzz in your output.