Désolé pour cette question stupide. Comment puis-je utiliser une condition pour un cas dans l'élément de langage javascript switch-case? Comme dans l'exemple ci-dessous, un cas doit correspondre lorsque la variable liCount
est <= 5 et> 0; cependant, mon code ne fonctionne pas:
switch (liCount) {
case 0:
setLayoutState('start');
var api = $('#UploadList').data('jsp');
api.reinitialise();
break;
case (liCount<=5 && liCount>0):
setLayoutState('upload1Row');
var api = $('#UploadList').data('jsp');
api.reinitialise();
break;
case (liCount<=10 && liCount>5):
setLayoutState('upload2Rows');
var api = $('#UploadList').data('jsp');
api.reinitialise();
break;
case (liCount>10):
var api = $('#UploadList').data('jsp');
api.reinitialise();
break;
}
Merci pour tout conseil!
if
s, car ils ont raison. C'est une terrible application deswitch
.var liCount = 2; switch (liCount) { case 0: console.log(0); break; case (liCount<=5 && liCount>0) && liCount: console.log('liCount<=5 && liCount>0'); break; case (liCount<=10 && liCount>5) && liCount: console.log('liCount<=10 && liCount>5'); break; case (liCount>10) && liCount: console.log(liCount); break; }
Réponses:
Cela marche:
switch (true) { case liCount == 0: setLayoutState('start'); var api = $('#UploadList').data('jsp'); api.reinitialise(); break; case liCount<=5 && liCount>0: setLayoutState('upload1Row'); var api = $('#UploadList').data('jsp'); api.reinitialise(); break; case liCount<=10 && liCount>5: setLayoutState('upload2Rows'); var api = $('#UploadList').data('jsp'); api.reinitialise(); break; case liCount>10: var api = $('#UploadList').data('jsp'); api.reinitialise(); break; }
Une version précédente de cette réponse considérait les parenthèses comme le coupable. En vérité, les parenthèses ne sont pas pertinentes ici - la seule chose nécessaire est
switch(true){...}
que vos expressions de cas soient évaluées en booléens.Cela fonctionne parce que la valeur que nous attribuons au commutateur est utilisée comme base de comparaison. Par conséquent, les expressions de cas, également évaluées en booléens, détermineront quel cas est exécuté. Pourrait également
switch(false){..}
inverser la tendance , passer et faire évaluer les expressions souhaitées comme fausses au lieu de vraies ... mais personnellement, préférez traiter des conditions qui évaluent la vérité. Cependant, cela fonctionne aussi, il vaut donc la peine de garder à l'esprit ce qu'il fait.Par exemple: si liCount vaut 3, la première comparaison est
true === (liCount == 0)
, ce qui signifie que le premier cas est faux. L'interrupteur passe ensuite au cas suivanttrue === (liCount<=5 && liCount>0)
. Cette expression prend la valeur true, ce qui signifie que ce cas est exécuté et se termine aubreak
. J'ai ajouté des parenthèses ici pour le rendre plus clair, mais elles sont facultatives, en fonction de la complexité de votre expression.C'est assez simple et une manière élégante (si cela correspond à ce que vous essayez de faire) de gérer une longue série de conditions, où peut-être une longue série de conditions
ìf() ... else if() ... else if () ...
pourrait introduire beaucoup de bruit visuel ou de fragilité.À utiliser avec prudence, car il s'agit d'un modèle non standard, bien qu'il s'agisse d'un code valide.
la source
switch(true) {
, etcase liCount == 0:
non? Sinon, cette comparaison estliCount == (liCount <=5 && liCount > 0)
.switch(false) {
}Vous avez bien trop compliqué cela. Écrivez-le avec des instructions if à la place comme ceci:
if(liCount == 0) setLayoutState('start'); else if(liCount<=5) setLayoutState('upload1Row'); else if(liCount<=10) setLayoutState('upload2Rows'); $('#UploadList').data('jsp').reinitialise();
Ou, si ChaosPandion essaie d'optimiser autant que possible:
setLayoutState(liCount == 0 ? 'start' : liCount <= 5 ? 'upload1Row' : liCount <= 10 ? 'upload2Rows' : null); $('#UploadList').data('jsp').reinitialise();
la source
setLayoutState
: P.Vous souhaitez utiliser les instructions if:
if (liCount === 0) { setLayoutState('start'); } else if (liCount <= 5) { setLayoutState('upload1Row'); } else if (liCount <= 10) { setLayoutState('upload2Rows'); } $('#UploadList').data('jsp').reinitialise();
la source
Voir la réponse de dmp ci-dessous. Je supprimerais cette réponse si je le pouvais, mais elle a été acceptée, c'est donc la meilleure chose à faire :)
Vous ne pouvez pas. Les interpréteurs JS exigent que vous compariez avec l'instruction switch (par exemple, il n'y a pas d'instruction "case when"). Si vous voulez vraiment faire cela, vous pouvez simplement créer desif(){ .. } else if(){ .. }
blocs.la source
liCount
. Je faisais simplement remarquer que la déclaration originale de cwolves selon laquelle «les interprètes JS exigent que les instructions case soient des valeurs statiques» était incorrecte. cwolves a depuis révisé cette déclaration, donc mon commentaire n'est plus pertinent.true
et cela fonctionne. Mais il a plus de 3 ans, donc je m'en fiche.switch (true) { case condition0: ... break; case condition1: ... break; }
fonctionnera en JavaScript tant que vos conditions renvoient des
boolean
valeurs appropriées , mais cela n'a pas beaucoup d'avantages par rapport auxelse if
instructions.la source
10
dans l'instruction switch? dans mon cas ne fonctionne pas je ne sais pas quelle est la raison.10 !== true
, donc non. Y a-t-il une variable qui pourrait avoir la valeur10
? Six
, alorscase x === 10:
ça marcherait.if (10) {..}
flow devrait passer laIf
condition, n'est-ce pas? car 10 ou tout entier sauf 0 sera traité comme une valeur de vérité et permettra d'entrer dans la condition. Je ne sais pas ce qui ne va pas avec la déclaration de commutation ici.switch
ne fonctionne tout simplement pas commeif
.if
teste si la condition est véridique .switch
teste si l'expression après leswitch
est===
( CaseClauseIsSelected étape 4 ) à la valeur de l'expression aprèscase
.C'est un cas où vous devriez utiliser des
if
clauses.la source
Si c'est ce que vous voulez faire, il serait préférable d'utiliser des
if
instructions. Par exemple:if(liCount == 0){ setLayoutState('start'); } if(liCount<=5 && liCount>0){ setLayoutState('upload1Row'); } if(liCount<=10 && liCount>5){ setLayoutState('upload2Rows'); } var api = $('#UploadList').data('jsp'); api.reinitialise();
la source
Votre code ne fonctionne pas car il ne fait pas ce que vous attendez de lui. Les blocs de commutation prennent une valeur et comparent chaque cas à la valeur donnée, en recherchant l'égalité. Votre valeur de comparaison est un entier, mais la plupart de vos expressions de cas se résolvent en une valeur booléenne.
Alors, par exemple, disons
liCount = 2
. Votre premier cas ne correspondra pas, car2 != 0
. Votre deuxième cas,(liCount<=5 && liCount>0)
évalue àtrue
, mais2 != true
, donc ce cas ne correspondra pas non plus.Pour cette raison, comme beaucoup d'autres l'ont dit, vous devez utiliser une série de
if...then...else if
blocs pour ce faire.la source
si les valeurs possibles sont des entiers, vous pouvez regrouper les observations. Sinon, utilisez ifs.
var api, tem; switch(liCount){ case 0: tem= 'start'; break; case 1: case 2: case 3: case 4: case 5: tem= 'upload1Row'; break; case 6: case 7: case 8: case 9: case 10: tem= 'upload2Rows'; break; default: break; } if(tem) setLayoutState((tem); api= $('#UploadList').data('jsp'); api.reinitialise();
la source
Notez que nous ne transmettons pas le score au commutateur mais vrai. La valeur que nous attribuons au commutateur est utilisée comme base de comparaison.
L'exemple ci-dessous montre comment nous pouvons ajouter des conditions dans le cas: sans aucune instruction if.
function getGrade(score) { let grade; // Write your code here switch(true) { case score >= 0 && score <= 5: grade = 'F'; break; case score > 5 && score <= 10: grade = 'E'; break; case score > 10 && score <= 15: grade = 'D'; break; case score > 15 && score <= 20: grade = 'C'; break; case score > 20 && score <= 25: grade = 'B'; break; case score > 25 && score <= 30: grade = 'A'; break; } return grade; }
la source
Bien que dans l'exemple particulier de la question du PO,
switch
ne soit pas approprié, il y a un exemple où le changement est toujours approprié / bénéfique, mais d'autres expressions d'évaluation sont également nécessaires. Cela peut être réalisé en utilisant la clause par défaut pour les expressions:switch (foo) { case 'bar': // do something break; case 'foo': // do something break; ... // other plain comparison cases default: if (foo.length > 16) { // something specific } else if (foo.length < 2) { // maybe error } else { // default action for everything else } }
la source