Bonjour à tous,
J'aimerai simplifier cette condition qui permet sur une série d'input de vérifier qu'un seul est supérieur à 0 et que les autres restent égal à 0.

if((nbrfilmSm > 0 && nbrfilmMd == 0 && nbrfilmLg == 0 && nbrfilmXl == 0) || (nbrfilmMd > 0 && nbrfilmSm == 0 && nbrfilmLg == 0 && nbrfilmXl == 0) || (nbrfilmLg > 0 && nbrfilmMd == 0 && nbrfilmSm == 0 && nbrfilmXl == 0) || (nbrfilmXl > 0 && nbrfilmMd == 0 && nbrfilmSm == 0 && nbrfilmLg == 0))

Dois-je utiliser un boucle ? ou un each() ? ou autre chose...

Merci de votre retour et vive l'automne !!
Modifié par urlien (24 Sep 2019 - 10:46)
Administrateur
Bonjour,

en 1ère optimisation, je compterais le total de nombres positifs et de nombres non nuls. Tu souhaites 1 et 1.

// Créer un tableau avec les 4 variables
var nope1 = [0, 5, 2, 0];
var ok = [0, 0, 8, 0];
var nope2 = [0, 0, 0, 0];

// Utilisation de .filter() et des arrow functions
var verify = {
  positiveAttitude(nb) { return nb.filter(n => n > 0).length },
  nbNonNul(nb) { return nb.filter(n => n !== 0).length }
};

// Affichage des résultats
console.log("Nb positif : ", verify.positiveAttitude(nope1), " / Nb non nul : ", verify.nbNonNul(nope1));
console.log("Nb positif : ", verify.positiveAttitude(ok), " / Nb non nul : ", verify.nbNonNul(ok));
console.log("Nb positif : ", verify.positiveAttitude(nope2), " / Nb non nul : ", verify.nbNonNul(nope2));


.filter()
Fonctions fléchées
la syntaxe de var verify{truc(x) { return blah }, idem };
Modifié par Felipe (24 Sep 2019 - 15:02)
Du coup j'ai testé et mis en place le code :

if($('.radioRestitution').is(':checked')){
			var testArray = [nbrfilmSm,nbrfilmMd,nbrfilmLg,nbrfilmXl,nbrfilm16Md,nbrfilm16Lg,nbrfilm16Xl,nbrfilmPb];
			var verify = {
				positiveAttitude(nb) { return nb.filter(n => n > 0).length },
				nbNonNul(nb) { return nb.filter(n => n !== 0).length }
			};
			if(verify.positiveAttitude(testArray) == 1 && verify.nbNonNul(testArray) ==1){
				fn_calcul_film();
			}else{
				fn_calcul_film_multiple(radioRestitution,nbrfilmSm,nbr_Lg_Xl,nbr_16_Lg_Xl,nbrfilmPb);
			}


Mais du coup dans Edge j'ai une erreur du style SCRIPT1003 (':' attendu)

Si je regarde la notice, il me dise que c'est les ':' d'un opérateur ternaire, hors il ne me semble pas que ce soit cela. Sur Mozilla et Chrome pas de souci à priori, sauf sur la version 44 de Chrome.

C'est normal Dc ? D'ou cela peut il venir
Modifié par urlien (05 Oct 2019 - 11:03)
Peut etre avez vous un.outils pour que je puisse tester le code ? Jsfiddle ne marche pas sur explorer:/..
Merki
Ola, en fait E11 ne prend pas en compte les arrow du coup j'ai réécrit la fonction comme suit :

const positiveAttitude = testArray.filter(function(n){return n > 0;});

Et cela fonctionne...
Gracie
urlien a écrit :
Ola, en fait E11 ne prend pas en compte les arrow du coup j'ai réécrit la fonction


Les arrow ?