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 :

RangeError lorsque j'essaie de définir un élément de tableau associatif : monTableau["length"]


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Par défaut RangeError lorsque j'essaie de définir un élément de tableau associatif : monTableau["length"]
    Bonjour,
    j'ai un bug surprennant qui se produit aussi bien sous Firefox que Chrome :

    dans un module ES6, je remplis un tableau associatif avec des données issues d'une requête HTTP vers une API REST (donc je ne code pas en dur ni les clés ni les valeurs de ce tableau, ce sont les données retournées par l'API).

    J'ai un bout de code de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let monTableau = new Array();
     
    for(let i = 0; i < donneesSources.length; i++) {
        let cle = donneesSources[i].toto;
        let valeur = donneesSources[i].titi;
        monTableau[cle] = valeur;
    }
    Tout se passe bien, jusqu'à ce que la boucle for tombe sur un cas particulier ou - manque de pot - donneesSources[i].toto vaut la chaîne "length" (ce qui est permis du point de vue de mon API REST).

    => Et là, c'est le drame !

    Uncaught RangeError: Invalid array length
    On dirait que l'interprêteur considère que j'essaie de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monTableau.length = valeur;
    avec valeur qui n'est pas un entier.

    => Alors qu'en réalité, j'essaie de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monTableau["length"] = valeur;
    ce qui n'est pas du tout la même chose de mon point de vue, mais on dirait que JS ne fait pas la différence.

    Comble du bonheur, si j'essaie de faire une recherche Google avec les mots-clés "Javascript", "Array", "length" ou "RangeError" je n'obtiens que des résultats sans aucun rapport avec mon problème.

    => Avez-vous déjà rencontré ce bug ?
    => Est-ce normal que JS ne fasse pas la différence entre monTableau.length et monTableau["length"] ?
    => Avez-vous des astuces pour contourner "proprement" ce problème sachant que je ne choisis pas le contenu de cle ni valeur ?

    Merci d'avance pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    tu as un tableau avec un seul élément

    => length=1

    premier élément indexe [0]

    ta boucle doit se faire jusqu'à length - 1
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre émérite Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Par défaut
    Ben, c'est pour ça que dans mon for je mets la condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i < donneesSources.length
    avec un "<" pour "strictement inférieur", donc l'interpréteur sort de la boucle lorsque i atteint donneesSources.length.

    Mais de toutes façons ce n'est pas le pb, c'est bien la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monTableau[cle] = valeur;
    qui déclenche l'erreur, et encore : uniquement lorsque cle vaut "length", comme décrit dans mon message (si tu le relis autrement qu'en diagonale )

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    Arf pas vu le strictement inférieur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     cle = donneesSources[i].toto;
    vaut quoi ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  5. #5
    Membre émérite Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Par défaut
    Ben justement : "length" ! Et c'est bien le problème !!!

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    Oui donc tu essayes de mettre dans une "clef" length d'un array une valeur string ...

    Or la "clef" "length" est en fait une propriété qui existe déjà sur un array et attend un integer ...


    Je ne sais pas si cela peut convenir à ton besoin mais si tu changes la case de ta "clef"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    let donneesSources=[{"toto": "Length","titi":"name"}]
    let monTableau = [];
     
    for(let i = 0; i < donneesSources.length; i++) {
        let cle = donneesSources[i].toto;
        console.log(cle);
        let valeur = donneesSources[i].titi;
        console.log(valeur);
       monTableau[cle] = valeur;
    }
    console.log(monTableau);
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  7. #7
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Salut,

    Et tu peux inverser clé / valeur dans ton tableau de sortie? Si les données sont compatibles, ça va "résoudre" le problème (en fait, il faudrait que chaque valeur de titi soit unique... peu probable;

    Sinon, tu reproduis la structure du tableau d'objets:
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    monTableau.push({cle,valeur});

  8. #8
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    Oui en plus JT a raison...
    ta boucle ne fera que modifier à chaque fois une clef existante donc tu n'auras jamais que les dernières valeurs dans ton tableau

    https://jsfiddle.net/smLdy7x5/

    il est aussi possible de modifier la clef afin qu'elle ne vienne pas interférer avec les propriété existantes de l'array ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     let cle = "_"+donneesSources[i].toto;
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Suppression élément vide tableau associatif
    Par stomerfull dans le forum Langage
    Réponses: 4
    Dernier message: 19/02/2010, 10h42
  2. Réponses: 1
    Dernier message: 23/10/2007, 17h30
  3. Réponses: 2
    Dernier message: 29/06/2006, 11h38
  4. message d'erreur lorsque j'essaie de changer la valeur d'un champ.
    Par cladsam dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 08/06/2006, 14h00
  5. Définir un élément HTML au dessus d'un autre
    Par genova dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 14/12/2005, 19h55

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