11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour à vous,
Je rencontre un "truc" bizarre...
Je vérifie un tableau en m'assurant que trois valeurs s'y trouvent...
if(countmaison.includes(5)&& countmaison.includes(12) && countmaison.includes(17)){
		document.getElementById("voies").insertAdjacentHTML('beforeend', '<li>Voie du pardon: V - XII - XVII</li>')
	}

Et dans la plupart des cas, ça marche.
Mais parfois, je dois l'écrire de cette manière pour que ça fonctionne (notez les guillemets au "12")...
if(countmaison.includes(5)&& countmaison.includes("12") && countmaison.includes(17)){
		document.getElementById("voies").insertAdjacentHTML('beforeend', '<li>Voie du pardon: V - XII - XVII</li>')
	}

Mais si je le modifie, alors dans les cas précédents, ça ne marche plus... Smiley decu
Je fais quoi de travers svp? Smiley eek
J'ai remarqué que je pouvais l'écrire comme ça...
if(countmaison.includes(5,12,17)){
		document.getElementById("voies").insertAdjacentHTML('beforeend', '<li>Voie du pardon: V - XII - XVII</li>')
	}

Mais ça ne résout pas mon problème.
Administrateur
Bonjour,

je ne sais pas quelle est la bonne façon de réaliser cette recherche, mais je commencerais par vérifier ce que contient le tableau avec console.log(countmaison); ou partir sur .values et typeof…
Felipe a écrit :
Bonjour,

je ne sais pas quelle est la bonne façon de réaliser cette recherche, mais je commencerais par vérifier ce que contient le tableau avec console.log(countmaison); ou partir sur .values et typeof…



countmaison = [jour, mois, annee, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13];


jour, mois et année sont récupérés d'un select en html.
les mx sont calculés à partir des 3 premiers...
voilà un contenu possible pour le tableau countmaison (copié depuis la console) :
countmaison :5,12,22,3,6,17,10,21,9,13,9,5,14

Mais j'ai peur que justement, les jour, mois et année ne soit pas considérés comme des chiffre... enfin, pas toujours... je me perds là.
Je viens de créer une petite fonction qui vérifie si "mois" est un nombre..
Mais en effet, il n'en est pas un... j'obtiens bien 12, mais il est visiblement considéré comme un string... et pas un parseInt.
Modifié par nahp (27 Nov 2019 - 16:29)
Modérateur
Et l'eau,

et si tu fais cela ?

//paye ton langage typage faible..... 
countmaison.map(function(item){
    return parseInt(item, 10)
}); 
//comparer ce qui est comparable ....
if(countmaison.includes(5)&& countmaison.includes(12) && countmaison.includes(17)){
        document.getElementById("voies").insertAdjacentHTML('beforeend', '<li>Voie du pardon: V - XII - XVII</li>')
    }

Modifié par niuxe (29 Nov 2019 - 01:20)
niuxe a écrit :
Et l'eau,

et si tu fais cela ?

//paye ton langage typage faible..... 
countmaison.map(function(item){
    return parseInt(item, 10)
}); 
//comparer se qui est comparable ....
if(countmaison.includes(5)&amp;&amp; countmaison.includes(12) &amp;&amp; countmaison.includes(17)){
        document.getElementById("voies").insertAdjacentHTML('beforeend', '&lt;li&gt;Voie du pardon: V - XII - XVII&lt;/li&gt;')
    }


L'idée était vraiment alléchante... mais la console renvoie "12" et pas 12...
Merci pour ta proposition.
countmaison = [parseInt(jour), parseInt(mois), parseInt(annee), parseInt(m4), parseInt(m5), parseInt(m6), parseInt(m7), parseInt(m8), parseInt(m9), parseInt(m10), parseInt(m11), parseInt(m12), parseInt(m13)];
JENCAL a écrit :
countmaison = [parseInt(jour), parseInt(mois), parseInt(annee), parseInt(m4), parseInt(m5), parseInt(m6), parseInt(m7), parseInt(m8), parseInt(m9), parseInt(m10), parseInt(m11), parseInt(m12), parseInt(m13)];


Merci. J'avais déjà pensé à ça... Je viens de tester et forcément la console me renvoie bien des chiffres, mais c'est que mon souci vient d'ailleurs... je ne comprends pas.
Oui mais du coup on peut pas deviner comme on voit pas ton code d’initialisation de jour mois année etc...
Oui tout à fait... je suis le seul responsable ici... je ne peux que vous remercier de l'aide apportée.
Mettre les choses en ligne nous aiderait-il?
Bonjour nahp,
Tu aurais un cas précis pour reproduire le bug
Cas je n'arrive pas a avoir un countmaison avec des nombres en string
Modérateur
autant pour moi. Je pensais que la méthode map résoudrait ton problème de typage.

la solution est :

for(let i in countmaison){
    countmaison[i] = parseInt(countmaison[i], 10);
}


@Jencal : +1

@nahp :
1. corrige tes erreurs que j'ai vu dans la console de ton lien
2. revoie ton code au niveau de tes if avec les méthodes includes. Tu utilises includes. Or, il serait plus pertinent d'utiliser every
Modifié par niuxe (29 Nov 2019 - 01:18)
niuxe a écrit :

2. revoie ton code au niveau de tes if avec les méthodes includes. Tu utilises includes. Or, il serait plus pertinent d'utiliser every


Je ne comprends pas pourquoi ce serait plus pertinent. Je cherche à vérifier si des valeurs sont présentes dans un tableau. Hors si je comprends bien, every est pour vérifier la nature des valeurs d'un tableau, non? Eclaire moi svp.
Modérateur
Et l'eau,

fait un test en console :

let x = [1,2,3];

x.includes(1, 2, 3)
//return false !



let x= [1,2,3],
args  = [1,2,3];

x.includes(...args);
// return false !




let x = [1,2,3];

x.every(item =>{
    switch(item){
        case 1:
            return item;
        case 2:
            return item;
        case 3:
            return item;
    }
})
// return true !






let x = [1,2,3, 5];


x.every(item =>{
    switch(item){
        case 1:
            return item;
        case 2:
            return item;
        case 3:
            return item;
        case 4:
            return item;
    }
}); 
// return false !

* j'ai fait le code à l'arrache. C'est pour te donner une piste (qui peut être pertinente ou pas) et en même temps un exemple complémentaire à la doc de mdn


Array.prototype.every(callback) permet de savoir si tous les éléments remplissent la condition
Array.prototype.some(callback) permet de savoir si un des éléments remplit la condition
Modifié par niuxe (02 Dec 2019 - 21:07)