I've spent hours trying to figure out this exercise and stuck at this point. I'm unable to get values from my switch statement to push to an array for "displayVal", and "val" variables.
const getDeck = () => {
const suits = ['Spades','Hearts','Diamonds','Clubs'];
let cards = [];
for(let s=0; s < suits.length; s++){
for(let d = 0; d < 13; d++){
let displayVal;
let val;
switch (d) {
case (d === 1):
displayVal = "Ace";
val = 11;
break;
case (d >=2 && d <= 10):
displayVal = d;
val = d;
break;
case (d === 11):
displayVal = "Jack"
val = 10;
break;
case (d === 12):
displayVal = "Queen"
val = 10;
break;
case (d === 13):
displayVal = "King"
val = 10;
}
cards.push({
val,
displayVal,
suit: suits[s]
} );
}
}
return cards;
}
const deck = getDeck();
console.log(`Deck length equals 52? ${deck.length === 52}`);
Using Branch if-else
Actually, you are using conditions so go ahead with branched if-else
const getDeck = () => {
const suits = ["Spades", "Hearts", "Diamonds", "Clubs"];
let cards = [];
for (let s = 0; s < suits.length; s++) {
for (let d = 0; d < 13; d++) {
let displayVal;
let val;
if (d === 1) {
displayVal = "Ace";
val = 11;
} else if (d >= 2 && d <= 10) {
displayVal = d;
val = d;
} else if (d === 11) {
displayVal = "Jack";
val = 10;
} else if (d === 12) {
displayVal = "Queen";
val = 10;
} else if (d === 13) {
displayVal = "King";
val = 10;
} else {
displayVal = "";
val = 0;
}
cards.push({
val,
displayVal,
suit: suits[s],
});
}
}
return cards;
};
const deck = getDeck();
console.log(deck);
console.log(`Deck length equals 52? ${deck.length === 52}`);
Using Switch case
const getDeck = () => {
const suits = ['Spades','Hearts','Diamonds','Clubs'];
let cards = [];
for(let s=0; s < suits.length; s++){
for(let d = 0; d < 13; d++){
let displayVal;
let val;
switch (true) {
case (d === 1):
displayVal = "Ace";
val = 11;
break;
case (d >=2 && d <= 10):
displayVal = d;
val = d;
break;
case (d === 11):
displayVal = "Jack"
val = 10;
break;
case (d === 12):
displayVal = "Queen"
val = 10;
break;
case (d === 13):
displayVal = "King"
val = 10;
default:
displayVal =""
val =0
}
cards.push({
val,
displayVal,
suit: suits[s]
} );
}
}
return cards;
}
const deck = getDeck();
console.log(deck);
console.log(`Deck length equals 52? ${deck.length === 52}`);
There is an alternative way / approach that may be used here.
Code Snippet
const getDeck = () => {
const suits = ['Spades','Hearts','Diamonds','Clubs'];
const getValueOf = x => x === 1 ? 11 : x > 10 ? 10 : x;
const displayValMap = {1: 'Ace', 11: 'Jack', 12: 'Queen', 13: 'King'};
return suits.map(
suit => (
[
...Array(13)
.keys()
]
.map(x => x + 1)
.map(d => ({
val: getValueOf(d),
displayVal: d in displayValMap
? displayValMap[d]
: d,
suit
}))
)
).flat();
}
const deck = getDeck();
console.log(`Deck length equals 52? ${deck.length === 52}`);
console.log(deck);
Explanation
val and displayVal (in above snippet, getValueOf - a one-line method; and displayValMap an object, is used)suits... spread-operator to generate an array of length 13, then get the keys of the array..map to make the generated array start from 1, instead of 0val, displayVal and suit props.flat() to return all objects into a single array instead of nested-arrays.Another way may be:
const getDeck = () => ['Spades','Hearts','Diamonds','Clubs'].map(
suit => (
[
...Array(13)
.keys()
]
.map(d => ({
val: (d === 0 ? 10 : d > 9 ? 9 : d) + 1,
displayVal: {0: 'Ace', 10: 'Jack', 11: 'Queen', 12: 'King'}[d] || d + 1,
suit
}))
)
).flat();
console.log(getDeck().length);
console.log(getDeck());