IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Mauvaise récupération de valeurs dans un tableau


Sujet :

JavaScript

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Mars 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2013
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Mauvaise récupération de valeurs dans un tableau
    Bonjour le monde

    Le but de cette snipet est, après un loop dans un xml qui me charge un tableau multidimensionnel avec, en [0] des string, et en [1] des numbers de trouver la plus grande valeur parmi les numbers.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    var i =0; var itemName; var ImageHeight;
    var arrRecup = new Array([],[]);
    var result;
     
    $.get('loadimages.xml', function(xml){
    	$(xml).find('creagraph').find('item').each(function(){
    		itemName = $(this).text();
    		imageHeight = $(this).attr('height');
    		arrRecup[0][i] = itemName;
    		arrRecup[1][i] = imageHeight;
    		i++
    	})
    });
     
    result = arrRecup.reduce(function(max){
    	return max >= arrRecup[1] ? max : arrRecup[1];
    	}, -Infinity);
    console.log(result);
    Je récupère bien les valeurs du tableau et l'inspecteur de Chrome me dit :

    [Array[0], Array[0]]
    0: Array[5]
    1: Array[5]
    0: "catalogue_1.jpg" 1: "catalogue_2.jpg" 2: "catalogue_3.jpg" 3: "catalogue_3_1.jpg"
    1: "620" 1: "620" 2: "739" 3: "741"

    Par contre le console.log(result) me renvoie [] Sans rien dedans.

    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.

    Sinon j'ai trouvé cette snippet que j'ai placé après la fonction qui appelle le xml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    arrRecup = arrRecup.map(function(x) {
        return [x[0], Number(x[1])];
    	});
    Mais je ne la comprends pas, elle le console.log(result) me renvoie (undefined, NaN).

    J'ai du mal à décoder les réponses de l'inspecteur encore et là j'ai besoin d'un coup de main. Merci d'avance.

  2. #2
    Membre averti
    Profil pro
    à la bougie alors
    Inscrit en
    Mai 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : à la bougie alors

    Informations forums :
    Inscription : Mai 2006
    Messages : 224
    Points : 362
    Points
    362
    Par défaut
    Citation Envoyé par bourbour Voir le message
    il cherche des numbers alors que ce sont des strings partout
    Pour ça, pas la peine de rechercher des "snippet"s surtout si tu ne les comprends pas. Regarde plutot la documentation de ECMAScript/Javascript avec parseInt que tu pourras utiliser dans ta
    Citation Envoyé par bourbour Voir le message
    loop dans un xml qui me charge un tableau multidimensionnel
    Idem pour Array.prototype.reduce, un peu de recherches (mais très peu) un peu de lecture (juste un peu) devrait facilement venir à bout de ton souci.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Mars 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2013
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Je fais ce que je peux. Autrement dit, j'apprends avec les forums, un bouquin et ma compréhension.
    Si je poste ici, c'est parce que j'ai déjà passé plusieurs heures sur mon problème et que ça ne sert strictement à rien de buter contre un mur. Demander de l'aide je pense qu'on le fait tous, et je me creuse la tête avant de venir ici.
    Merci pour ta réponse, mais ta condescendance tu peux la garder par contre. Un problème de code n'est jamais compliqué quand on connait la solution et c'est pareil pour tous les langages

  4. #4
    Membre averti
    Profil pro
    à la bougie alors
    Inscrit en
    Mai 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : à la bougie alors

    Informations forums :
    Inscription : Mai 2006
    Messages : 224
    Points : 362
    Points
    362
    Par défaut
    Aucune condescendance dans ma réponse, tout au plus un peu d'agacement que j'essaye, maladroitement apparement, d'adoucir avec un peu d'humour.
    Tu passes des heures à quoi ? A tu essayé les recherches suggérées ? Les premiers liens dans les deux cas sont explicatifs.
    Si tu ne comprends pas ce que font parseInt ou Array.prototype.reduce, il te suffit de poser la question et on te répondra. Aucun problème à ça.
    Si tu ne connais pas le langage, et il faut un début à tout, commence par l'apprendre avec des cas simples. Il y a des tutoriaux à foison et des forums pour avoir des explications.

    Maintenant, écrire du code qu'on ne comprends pas au petit bonheur la chance en espérant que ça fonctionne ne me semble pas une approche trés pragmatique. Mais à ta décharge, elle semble assez répandue.

  5. #5
    Membre averti
    Profil pro
    à la bougie alors
    Inscrit en
    Mai 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : à la bougie alors

    Informations forums :
    Inscription : Mai 2006
    Messages : 224
    Points : 362
    Points
    362
    Par défaut
    Citation Envoyé par bourbour Voir le message
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var arrRecup = new Array([],[]);
    pourquoi pas. Mais pourquoi mélanger deux écritures ?
    Soit avec une écriture litérale objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var arrRecup = [[],[]];
    Soit avec une écriture avec les constructeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

Discussions similaires

  1. [AC-2010] Expression régulières et récupération de valeur dans un tableau
    Par Thugann dans le forum VBA Access
    Réponses: 0
    Dernier message: 30/06/2014, 09h27
  2. Récupération valeurs dans un tableau JSON
    Par ladinho58 dans le forum jQuery
    Réponses: 2
    Dernier message: 09/01/2013, 07h50
  3. [MySQL] récupération de valeurs dans un tableau
    Par cboulie dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 30/11/2010, 17h07
  4. Récupération de valeurs d'un tableau
    Par leeloo076 dans le forum ASP
    Réponses: 12
    Dernier message: 25/03/2004, 10h59
  5. Décaler des valeurs dans un tableau
    Par sh2003 dans le forum Langage
    Réponses: 6
    Dernier message: 20/03/2004, 16h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo