Envoyé par
bourbour
Je me demande si je n'ai pas mal formuler mon tableau et qu'il cherche des numbers alors que ce sont des strings partout.
L'intuition est bonne. Où récupères tu ta valeur sous forme de chaine de caractères ?
Dans
1 2 3 4 5
| itemName = $(this).text();
imageHeight = $(this).attr('height');
arrRecup[0][i] = itemName;
arrRecup[1][i] = imageHeight;
i++ |
As tu besoin de cette valeur sous forme de chaine de caractères ? Non. Cela signifie que tu dois la convertir le plus tôt possible, c'est à dire à l'affectation.
1 2 3 4 5
| itemName = $(this).text();
imageHeight = parseInt($(this).attr('height'));
arrRecup[0][i] = itemName;
arrRecup[1][i] = imageHeight;
i++; |
la fonction parseInt peut échouer à convertir ta chaine de caractères en nombre, et dans ce cas elle renverra NaN (Not A Number). Tu as alors deux possibilités, soit tu testes explicitement pour renvoyer une erreur, soit tu veux quand même traiter et dans ce cas tu fournis une valeur par défaut, comme par exemple
1 2 3 4 5
| itemName = $(this).text();
imageHeight = parseInt($(this).attr('height')) || 0;
arrRecup[0][i] = itemName;
arrRecup[1][i] = imageHeight;
i++; |
NaN est évalué à false, le ou logique (||) renverra donc la deuxième valeur : 0.
Pour trouver le maximum, l'utilisation de Array.prototype.reduce est une bonne idée, mais son utilisation est incorrecte
1 2 3
| result = arrRecup.reduce(function(max){
return max >= arrRecup[1] ? max : arrRecup[1];
}, -Infinity); |
D'abord, la fonction que tu passes en argument à reduce prend jusqu'à quatre valeurs qui sont dans l'ordre : valeur précédente, valeur courante, index, tableau ; où
- valeur précédente est la valeur initiale au premier appel, la valeur retournée par l'appel précédent sinon
- valeur courante est la valeur de l'élément courant du tableau
- index est l'index courant de l'élément du tableau
- tableau est le tableau sur lequel la fonction a été appelée
la fonction callback est donc appellée avec callback(précédente,tableau[index],index,tableau) et elle retourne la nouvelle valeur de précédente
Dans ton cas, tableau est un tableau dont le premier niveau est composé de deux autres tableaux. Le premier, à l'indice 0, correspond aux noms des éléments (itemName) ; le deuxième, à l'indice 1, aux hauteurs des images (imageHeight).
Tu cherches à obtenir la hauteur maximale, il te faut donc traiter le tableau concernant les hauteurs :arrRecup[1].reduce(....
Donc, ton code devrait-être :
1 2 3
| result = arrRecup[1].reduce(function(max,cur){
return max >= cur ? max : cur;
}, -Infinity); |
Une autre spécificitée de Array.prototype.reduce est que si tu ne fournis pas de valeur initiale, la fonction va s'initialiser avec la valeur du premier élément de ton tableau soit la valeur à l'indice 0 et le premier élément passé à callback sera l'élément à l'indice 1. C'est à dire que si tu es sûr que tontableau ne sera jamais vide, ou en plus pragmatique, si tu testes si ton tableau est vide pour éviter des traitements inutiles, ton code peut-être :
1 2 3
| result = arrRecup[1].reduce(function(max,cur){
return max >= cur ? max : cur;
}); |
Une dernière remarque, tu définis ton tableau avec
var arrRecup = new Array([],[]);
pourquoi pas. Mais pourquoi mélanger deux écritures ?
Soit avec une écriture litérale objet
Soit avec une écriture avec les constructeurs
var arrRecup = new Array(new Array(),new Array());
L'écriture litérale objet est strictement équivalente à l'autre. Contrairement à des langages comme le C par exemple, elle ne représente pas un initialiseur, c'est bel et bien une création d'objet.
Partager