What I am trying to achieve is a pattern-matching version of FizzBuzz. Similar to the one available in Swift just using JavaScript.
If a number is divisible by 3 console.log Fizz and if by 5 then Buzz if by both FizzBuzz if neither then log the number. The challenge I am facing is this:
function fizzBuzz(numbers) {
for (number in numbers) {
let div3 = number % 3 == 0 ? true : false;
let div5 = number % 5 == 0 ? true : false;
switch ([div3, div5]) {
case [true, true]:
console.log("FizzBuzz");
break;
case [true, false]:
console.log("Fizz");
break;
case [false, true]:
console.log("Buzz");
break;
case [false, false]:
console.log(number);
break;
}
}
}
var array = [...Array(100).keys()];
fizzBuzz(array);
this does not work I tried without the square brackets but then only the first variable gets evaluated and the other one is ignored. Could someone shed some light onto this for me? In Swift this is very simple and works flawlessly I am trying to achieve the same in JS.
I tried this but like mentioned above only evaluates the first variable in the brackets which is div3, div5 gets ignored completely:
function fizzBuzz(numbers) {
for (number in numbers) {
let div3 = number % 3 == 0 ? true : false;
let div5 = number % 5 == 0 ? true : false;
switch (div3, div5) {
case (true, true):
console.log("FizzBuzz");
break;
case (true, false):
console.log("Fizz");
break;
case (false, true):
console.log("Buzz");
break;
case (false, false):
console.log(number);
break;
}
}
}
var array = [...Array(100).keys()];
fizzBuzz(array);
Is there even a syntax like this which I am trying to achieve in JS?
switch/case
compares values using the ===
operator. This compares arrays by identity, not by contents, so you can't use it with array literals as you've tried.
JavaScript doesn't have tuples. div3, div5
uses the comma operator, which simply evaluates it to the value of div5
.
If you want something like your coding pattern, I think the best you can do is use JSON.
function fizzBuzz(numbers) {
for (number in numbers) {
let div3 = number % 3 == 0 ? true : false;
let div5 = number % 5 == 0 ? true : false;
switch (JSON.stringify([div3, div5])) {
case '[true,true]':
console.log("FizzBuzz");
break;
case '[true,false]':
console.log("Fizz");
break;
case '[false,true]':
console.log("Buzz");
break;
case '[false,false]':
console.log(number);
break;
}
}
}
var array = [...Array(100).keys()];
fizzBuzz(array);