J'essaye d'écrire une fonction qui renvoie vrai s'il y a une paire dans une main de cinq cartes. Cela fonctionne lorsque je place return false avant la dernière parenthèse fermante. Lorsque je place le return false dans les boucles for imbriquées, il est automatiquement renvoyé. Pourquoi?
var cards = [ {value: 4, suit: 'Clubs'}, {value: 8, suit: 'Hearts'}, {value: 7, suit: 'Spades'}, {value: 5, suit: 'Clubs'}, {value: 8, suit: 'Diamonds'}, ] function pair(handOfCards){ for (var i=0; i<handOfCards.length; i++){ for (var j=i+1; j<handOfCards.length; j++){ if(handOfCards[i].value===handOfCards[j].value){ return true } return false } } }
5 Réponses :
<₹ return
arrête la poursuite de l'exécution de la fonction . Dans votre code, il renverra une valeur, que la condition soit satisfaite ou non.
Même si vous mettez else
avant return false
, il fera de même et return
dans la première boucle.
Si vous décomposez votre code en cette boucle for:
for (var j=i+1; j<handOfCards.length; j++){ if(handOfCards[i].value===handOfCards[j].value){ return true } return false }
Vous pouvez voir que return false est appelé juste après l'instruction if, ce qui signifie que cela ne passera que par 1 itération du for boucle, puis retournez false.
Une manière de résoudre ce problème serait d'ajouter une valeur booléenne found
initialisée à false. Au lieu de renvoyer true lorsque la correspondance est trouvée, remplacez le booléen trouvé par true. À la fin de la fonction, retournez la valeur found
, indépendamment de true ou false.
Comme indiqué dans le MDN:
L'instruction return termine l'exécution de la fonction et spécifie une valeur à renvoyer à l'appelant de la fonction.
Par conséquent, le problème est que chaque fois que vos critères ne sont pas satisfaits, la fonction entière est arrêtée, donc la boucle for est interrompue et renvoie false chaque fois que if échoue.
Pour résoudre le problème, déplacez simplement l'instruction return en dehors des boucles for, de sorte que si aucune paire n'est trouvée, false
est renvoyé.
function pair(handOfCards){ for (var i=0; i<handOfCards.length; i++){ for (var j=i+1; j<handOfCards.length; j++){ if(handOfCards[i].value===handOfCards[j].value){ return true; } } } return false; // <-- return false statement moved here. }
Pour vous déplacer un peu plus loin, vous pouvez utiliser une approche en boucle unique et utiliser un Définir
pour les valeurs visitées.
function pair(handOfCards) { var i, values = new Set; for (i = 0; i < handOfCards.length; i++) { if (values.has(handOfCards[i].value)) { // check set return true; } values.add(handOfCards[i].value); // add value to set } return false; } var cards1 = [{ value: 4, suit: 'Clubs' }, { value: 8, suit: 'Hearts' }, { value: 7, suit: 'Spades' }, { value: 5, suit: 'Clubs' }, { value: 8, suit: 'Diamonds' }], cards2 = [{ value: 4, suit: 'Clubs' }, { value: 8, suit: 'Diamonds' }]; console.log(pair(cards1)); // true console.log(pair(cards2)); // false
i = 0 le premier passage dans la boucle interne signifiant que vous recherchez une correspondance avec card.value: 4
Avec le retour false à la position actuelle, il bouclera une fois où j = [1, .., 4] et s'il n'y a pas d'autres cartes avec la valeur: 4, il retournera false.
Le retour false doit être en dehors des boucles pour permettre la vérification de toutes les valeurs i = [1-4].
Parce que c'est ainsi que fonctionne javascript :) Partout où vous mettez un retour, la portée de la fonction se termine
vous revenez trop tôt, car vous êtes toujours en boucle.
Parce que vous retournez faux quoi qu'il arrive. Un simple débogage ou "jouer à l'ordinateur" vous dira pourquoi - lorsque vous appuyez sur l'instruction
return
en dehors d'une condition que vous ... retournez. developer.mozilla.org/en-US/docs/ Web / JavaScript / Reference /… "L'instructionreturn
termine l'exécution de la fonction et spécifie une valeur à renvoyer à l'appelant de la fonction."Déplacez simplement le
return false
hors des boucles for, car il ne doit renvoyer false que si true ne doit pas être renvoyé.return
, en javascript, arrête toute exécution ultérieure de son bloc fonction .