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

  1. #1
    Membre éclairé 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 : 42
    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
    Points : 799
    Points
    799
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 665
    Points
    66 665
    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

  3. #3
    Membre éclairé 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 : 42
    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
    Points : 799
    Points
    799
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 665
    Points
    66 665
    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 ?

  5. #5
    Membre éclairé 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 : 42
    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
    Points : 799
    Points
    799
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 665
    Points
    66 665
    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);

  7. #7
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    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 681
    Points : 5 221
    Points
    5 221
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 665
    Points
    66 665
    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;

  9. #9
    Membre éclairé 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 : 42
    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
    Points : 799
    Points
    799
    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 ...
    Oui c'est bien ça ... perso je trouve ça totalement hallucinant cette confusion entre propriété de l'objet et clé du tableau, ça rend l'utilisation des tableaux associatifs en JS hyper casse-gueule !!!

    'fin bon bref, le language est ce qu'il est, faut bien faire avec.

    Et tu peux inverser clé / valeur dans ton tableau de sortie?
    Malheureusement non : le code que je vous ai posté est simplifié mais en réalité les valeurs sont des objets ...

    Sinon, tu reproduis la structure du tableau d'objets:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monTableau.push({cle,valeur});
    Oui, c'est comme ça que ça va se finir je sens, mais c'est super chiant, c'est plus un tableau associatif, du coup je ne peux plus accéder aux valeurs avec un simple monTableau[cle], il faut que je fasse une boucle pour tester toutes les clés ... faisable mais si je peux éviter ...

  10. #10
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    Teste si l'array n'a pas déja cette 'clef' = propriété native avec hasOwnProperty

    sinon passe par des JSON ...

  11. #11
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    du coup je ne peux plus accéder aux valeurs avec un simple monTableau[cle],
    ben si https://jsfiddle.net/smLdy7x5/1/

    Mais bon la boucle écrase l'existant ... a voir si cela convient à ton besoin

  12. #12
    Membre éclairé 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 : 42
    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
    Points : 799
    Points
    799
    Par défaut
    Teste si l'array n'a pas déja cette 'clef' = propriété native avec hasOwnProperty
    Je veux bien, mais vu que les clés ET valeurs viennent d'une source de données externe à mon code, si hasOwnProperty me dit que la clé est utilisée, je suis bien avancé : ensuite je fais quoi ?

    sinon passe par des JSON ...
    Je ne vois pas le rapport ... est-ce que tu peux développer un peu ou donner un lien STP ?
    du coup je ne peux plus accéder aux valeurs avec un simple monTableau[cle],
    Ah oui, du coup ce n'est plus techniquement un tableau associatif mais un "Object", mais c'est assez proche d'utilisation, je crois que je vais partir là-dessus.

  13. #13
    Membre éclairé 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 : 42
    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
    Points : 799
    Points
    799
    Par défaut
    Mais bon la boucle écrase l'existant ... a voir si cela convient à ton besoin
    C'était déjà le cas avec mon code initial, mais dans mon cas ce n'est pas un souci car dans les données sources les cles sont uniques.

  14. #14
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    sinon passe par des JSON ...
    c'est un un JSON (JavaScript Object Notation) objet ...

  15. #15
    Membre éclairé 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 : 42
    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
    Points : 799
    Points
    799
    Par défaut
    Bon, merci pour vos réponses, ça marche bien avec un bête Object, donc je marque le post comme résolu.

    Mais pour "ouvrir le débat", vous ne trouvez pas que c'est tout pourri du coup les tableaux associatifs en JS ? Il doit y avoir une bonne raison mais elle m'échappe ...

  16. #16
    Membre éclairé 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 : 42
    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
    Points : 799
    Points
    799
    Par défaut
    vous ne trouvez pas que c'est tout pourri du coup les tableaux associatifs en JS ? Il doit y avoir une bonne raison mais elle m'échappe ...
    Je me répond à moi-même, car je crois avoir compris : en fait, en Javascript les tableaux associatifs ... n'éxistent pas !
    On peut - dans une certaine mesure - utiliser un Object "comme si" c'était un tableau associatif, mais c'est tout.
    Et si on utilise un Array, on bénéficie de l'interface d'Object dont Array descend (donc ça marche jusqu'à un certain point), mais on ajoute aussi des propriétés pouvant entrer en collision avec l'utilisation qu'on cherche à faire, comme moi avec "length".

    Donc conclusion : oui, c'est tout pourri, mais maintenant je sais pourquoi ... on en apprend tous les jours (mais c'est quand-même tout pourri)

  17. #17
    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 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1
    Par défaut
    mais on ajoute aussi des propriétés pouvant entrer en collision
    avec les propriétés natives de l'objet ... oui

  18. #18
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    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 681
    Points : 5 221
    Points
    5 221
    Par défaut
    en bouclant avec for ... of, pas de problème pour les propriétés natives;

+ 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