Bonjour,
Je voudrais simplifier cette écriture mais je ne vois pas comment.
Code:
1
2
3
4 if(exactWF<10){} if(exactWF>=10 && exactWF<20){} if(exactWF>=20 && exactWF<50){} // ... jusqu'à 500 avec 7 tranches inégales et croissantes
Version imprimable
Bonjour,
Je voudrais simplifier cette écriture mais je ne vois pas comment.
Code:
1
2
3
4 if(exactWF<10){} if(exactWF>=10 && exactWF<20){} if(exactWF>=20 && exactWF<50){} // ... jusqu'à 500 avec 7 tranches inégales et croissantes
Bonjour,
Déjà, il n'est pas utile de parcourir tous les if.
Il faut :
Ensuite, il faudrait savoir ce qui se trouve dans chaque {}, pour éventuellement factoriser ce qui peut l'être.Code:
1
2
3
4
5 if else if else if ... else
Enfin, pas sûr qu'un switch() apporte une amélioration quelconque.
Merci, j'aurais du y penser mais il y a longtemps que je n'ai pas codé.
Pour chaque condition, je positionne juste une variable n=1, n=2 dans l'ordre, c'est à dire que je numérote les tranches.
Je ne pense pas non plus, c'est pour cela que j'ai parlé d'équivalent de switch()
if / else if / else est bien un équivalent de switch ;).
Cela dit, on peut simplifier (grâce aux else if) :
Code:
1
2
3
4 if(exactWF<10){} // inférieur à 9 else if(exactWF<20){} // entre 10 et 19 else if(exactWF<50){} // entre 20 et 49 // ... jusqu'à 500
sinon un switch true
Code:
1
2
3
4
5
6
7
8 switch (true){ case (exactWF<10) : // inférieur à 9 break; case (exactWF<20) : // entre 10 et 19 break; case (exactWF<50) : // entre 20 et 49 // ... jusqu'à 500 }
Bien vu !
Ça ne me serait pas venu à l'idée... mais j'en prend bonne note.
N.B. Cela dit, on est d'accord qu'on n'y gagne pas grand chose (ça prend même plus de caractères)
Sinon, en prenant les conditions "à l'envers" :
on arrive à une fonction :Code:
1
2
3
4 if(exactWF>=500){} // supérieur à 500 (inclus) else if(exactWF>=300){} // entre 499 et 300 else if(exactWF>=200){} // entre 299 et 200 // ... jusqu'à 0
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 function return_n_from_wf( wf ) { let n; // tranches (à définir selon tes critères) // important : ordre décroissant ! let wf_arr = [500,300,200,100,50,20,10,0]; // valeurs de n let n_arr = [8,7,6,5,4,3,2,1]; for( let i=0; i<wf_arr.length; i++ ) { if(wf>=wf_arr[i]) { return n_arr[i]; // retourne le n correspondant + on sort de la boucle } } return 0; // retourne 0 sinon }
Code:n = return_n_from_wf( exactWF );
Oui!Citation:
N.B. Cela dit, on est d'accord qu'on n'y gagne pas grand chose (ça prend même plus de caractères)
Le seul avantage que j'y vois est peut-être la clarté du code ? Mais c'est subjectif ...
Bonjour,
il m'est arrivé de traiter des « switch à trous » en utilisant la méthode findIndex() des Array, utile quand cela devient un peu trop tordu.
Un exemple pourrait donner :
on pourrait rendre cette « écriture plus élégante » via l'utilisation d'un objet et/ou d'une fonction autonome ... « Mais c'est subjectif ... » :mouarf:Code:
1
2
3
4
5 const tabSwitch = [10, 20, 40, 80, 160, 320]; const valSwitch = ["<= à 10", "<= 20", "<= 40", "<= 80", "<=160", "<= 320"]; // on peut mettre ce que l'on veut voire des référence à des fonctions const valRef = 127; const index = tabSwitch.findIndex((val) => valRef <= val); console.log(valSwitch[index] || "non trouvée");
PS :
c'est dans le même esprit !Citation:
Envoyé par jreaux62
moimp ne dis pas ce qui se passe au delà de 500... :weird:
Dans ma fonction, j'ai traité ce cas.
C'est pour cette raison que les nombres sont dans l'ordre décroissant (sinon il aurait fallu traiter ce cas, avec un peu de code supplémentaire)
Dans la proposition de NoSmoking, au delà de 320 (selon l'exemple), ça affiche "non trouvée".
@NoSmoking : peux-tu expliquer cette ligne ?
VU ! syntaxe expliquée dans la doc : .findIndex()
Code:const index = tabSwitch.findIndex((val) => valRef <= val);
Merci à vous trois. Je ne m'attendais pas à ce qu'une discussion apparemment anodine suscite autant de contributions. Sans m'y attendre, j'ai appris beaucoup de choses.