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 :

Est-ce qu'un array DOIT commencer avec un index de 0


Sujet :

JavaScript

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut Est-ce qu'un array DOIT commencer avec un index de 0
    Bonjour,
    Je vous prie de m'excuser si ma question est bête et null et même si je connais la réponse, mais dans le doute je la pose.

    Je construis une array doit voici ce que m'affiche
    console.log()

    sensor: Object [ <3 empty slots>, […] ]
    Est-ce que c'est une signer d'erreur ou de warning.

    La raison est que mon array ne commence pas par zero mais par 3

    sensor: […]
    3: […]
    5: 6.746
    6: 11.56
    7: 12.21

    https://www.w3schools.com/js/js_arrays.asp
    Adding elements with high indexes can create undefined "holes" in an array:
    A mon avis, ce n'est interdit, mais si je fais une loop sur cette array, j'aurai " des trous". Mais ca me met dans le doute, si javascript ... le permets

    Cordialement
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  2. #2
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 739
    Points
    4 739
    Par défaut
    le prmier indice des tableau commence bien à zéro (toujours)

    Mais ce n'est pas autant qu'il "doit" être toujours "intégralement" rempli...

    un exemple plutôt que milles mots :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var tbl = [];
    tbl[1] = "Doe";
    tbl[2] = "zim"; 
    tbl[45] = "quatre cinq"; 
     
    console.log( 'taille tableau = ' + tbl.length );
     
    for (var item in tbl ) {
      console.log( item + '--> ' + tbl[item]);
    }
    donne comme retour :

    taille tableau = 46
    1--> Doe
    2--> zim
    45--> quatre cinq

    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    console.log(' 15--> ' + tbl[15]);
    donne
    15--> undefined
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  3. #3
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Salut,
    Citation Envoyé par pierrot10 Voir le message

    Je construis une array doit voici ce que m'affiche
    console.log()



    Est-ce que c'est une signer d'erreur ou de warning.

    La raison est que mon array ne commence pas par zero mais par 3
    Es-tu sûr que c'est une array ? Il semblerait que ce soit un objet qui est appelé par certains "tableau associatif" puisque tu as le message : sensor: Object [ <3 empty slots>, [] ] a moins que tu utilises un navigateur spécial car moi quand j'ai une array il me met sur Chrome "Array(X)" et non "Objet"...

    EDIT : sur FF il met : […]

    EDIT2 : FF met ça ([…]) même pour un objet !!! Pour faire la différence il faut regarder : __proto__

    -----> +1 pour Chrome !!!

  4. #4
    Invité
    Invité(e)
    Par défaut
    Saperlipopette !

    Je viens seulement de capter que array.length ne renvoie pas le nombre d'éléments d'un array !!

    Pour ça, je n'ai pas trouvé de fonction native (comme count en PHP). (??)

    Du coup, il faut en écrire une :
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function arrCount( tbl )
    {
      var count = 0;
      if( tbl.length )
      {
          for (var ii in tbl ) {
             count++;
          }
       }
       return count;
    }
    Ici, tbl.length sert juste à vérifier qu'il existe (pas 0)

    N.B.
    Citation Envoyé par psychadelic Voir le message
    le prmier indice des tableau commence bien à zéro (toujours)...
    Ben non, un array ne commence pas forcément à l'indice 0 : ton exemple le prouve.
    Dernière modification par Invité ; 02/03/2018 à 10h41.

  5. #5
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Saperlipopette !

    Je viens seulement de capter que array.length ne renvoie pas le nombre d'éléments d'un array !!
    Faux, le nombre d'éléments d'un Array est bien donné par length ! Mais chaque élément peut être vide ou contenir une donnée (texte, nombre, Array, Object).

    Ta fonction est erronée :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    // constructon d'un Array avec 51 éléments dont 3 remplis !	
    let arT = Array.from( new Array ( 51 ), ( item, i ) => {
    	if ( i % 25 === 0 ){
    		return i;
    	}
    });
     
    klog( arT ); // voir ci-dessous
    klog( arT.length ); // 51
     
    { // @jreaux, erreur count === length !
    	function arCount( tbl ){
    		let
    			count = 0;
     
    		if ( tbl.length ){
    			for ( let ii in tbl ){
    				 count++;
    			}
    	 }
     
    	 return count;
    	}
     
    	klog( arCount( arT ) ); // 51 !
    }
     
    { // count correct et newAr
    	function arCount( tbl ){
    		let
    			count = 0,
    			newAr = [];
     
    		for ( const item of tbl ){
    			if ( item || item === 0 ){
    				count++;
    				newAr.push( item );
    			}
    		}
     
    	 return [ count, newAr ];
    	}
     
    	klog( arCount( arT )[0] ); // 3 
    	klog( arCount( arT )[1] ); // 0, 25, 50
    }
     
    /*
     * 0,,,,,,,,,,,,,,,,,,,,,,,,,25,,,,,,,,,,,,,,,,,,,,,,,,,50
     * 51
     * 51
     * 3
     * 0,25,50
     */

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  6. #6
    Invité
    Invité(e)
    Par défaut
    @danielhagnoul
    Ce que tu dis est de la poudre de perlimpinpin !

    Et sans vouloir te vexer...
    Tes exemples de code sont toujours inutilement compliqués et difficiles à lire / comprendre.... (sauf pour les initiés, dont je ne fais pas partie)
    Et klog ? (une fonction à toi ? console.log est trop long à écrire ?)...



    Si je reprends l'exemple :
    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 tbl = [];
    tbl[1] = "Doe";
    tbl[2] = "zim"; 
    tbl[45] = "quatre cinq"; 
     
    console.log( 'taille tableau = ' + tbl.length );
    console.log( 'nombre d\'éléments = ' + arrCount( tbl ) );
     
    function arrCount( tbl )
    {
      var count = 0;
      if( tbl.length )
      {
          for (var ii in tbl ) {
             count++;
          }
       }
       return count;
    }
    donne comme retour :
    taille tableau = 46
    nombre d'éléments = 3
    Or on n'a que 3 éléments définis.
    Pas 46.



    On peut lire :
    ...Vous pouvez modifier la propriété length d'un tableau à loisir ...
    ...
    ...De ce fait, la propriété length d'un tableau ne renseigne en rien sur le nombre de valeurs définies dans le tableau...

    Obtient ou définit la longueur du tableau. Il s'agit d'un nombre avec une unité de plus que l'élément le plus élevé défini dans un tableau.
    ...
    Remarques
    En JavaScript, les tableaux sont fragmentés et les éléments d'un tableau ne doivent pas être* contigus. La propriété length n'est pas nécessairement le nombre d'éléments du tableau.
    * "ne sont pas obligés d'être" ("do not have to be" en version originale)
    Dernière modification par Invité ; 02/03/2018 à 11h11.

  7. #7
    Invité
    Invité(e)
    Par défaut
    En continuant les tests... (c'est là ou je DETESTE JavaScript)

    Quand les index ne sont pas (tous) numériques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var tbl = [];
    tbl['a'] = "Doe";
    tbl[36] = "zim"; 
    tbl['z'] = "quatre cinq";
    taille tableau = 37
    nombre d'éléments = 3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var tbl = [];
    tbl['a'] = "Doe";
    tbl['c'] = "zim"; 
    tbl['z'] = "quatre cinq";
    taille tableau = 0
    nombre d'éléments = 0
    C'est QUOI ce binzz !?!?!

    Là, c'est vraiment inique...

  8. #8
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 451
    Points : 4 600
    Points
    4 600
    Par défaut
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var tbl = [];
    tbl['a'] = "Doe";
    tbl['c'] = "zim"; 
    tbl['z'] = "quatre cinq";
    on peut aussi traiter le tableau comme un objet :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    Object.keys(tbl).length
    => retourne bien 3
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  9. #9
    Invité
    Invité(e)
    Par défaut
    Ah !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object.keys(tbl).length
    Retourne bien 3...
    ...alors que tbl.length retourne 0 !


    Ben voilà une solution qu'elle est bonne !
    (simple, concis, efficace... et en UNE ligne ! )

  10. #10
    Membre éclairé
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 335
    Points : 715
    Points
    715
    Par défaut
    Bonjour,
    Cela dépend de ce que l'on souhaite comptabiliser : les index définis ou les valeurs définies ?
    La construction avec Array.from de danielhagnoul crée 51 index qui sont tous des propriétés énumérables d'où le résultat de 51 avec la fonction de jreaux62.
    Cependant ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    let arT = new Array ( 51 );
    arT[0]=0;
    arT[25]=25;
    arT[50]=50;
    Il n'y a que 3 propriétés créées, une boucle sur l'énumérabilité donnera 3.

  11. #11
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Merci pour ces échanges instructifs!!
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  12. #12
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 739
    Points
    4 739
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Saperlipopette !

    le premier indice des tableaux commence bien à zéro (toujours)
    N.B.
    Ben non, un array ne commence pas forcément à l'indice 0 : ton exemple le prouve.
    Heu, comment le dire autrement...
    , Tableau_X.length ==> renvoi le nombre d'indices possibles sur "Tableau_X" ; le premier indice utilisable est égal à zéro, (pas à -15 [par exemple] )

    mais cela ne signifie pas pour autant qu'il soit utilisé

    Mais ce n'est pas autant qu'il "doit" être toujours "intégralement" rempli...
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  13. #13
    Invité
    Invité(e)
    Par défaut
    Heu, comment le dire autrement... Ben encore "non"...
    Les différents exemples montrent que les indices peuvent aussi être autre chose que des numériques... et à fortiori pas forcément d'indice "zéro" en vue...

    J'ai donné des liens. Il suffit de lire les définitions...

    Si on continue les tests :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var tbl = [];
    tbl['a'] = "Doe";
    tbl[23] = "zim"; 
    tbl['b52'] = "boum"; 
    tbl[14] = "carbone"; 
    tbl['zzz'] = "badaboum"; 
     
     
    for (var item in tbl ) {
      console.log( item + '--> ' + tbl[item]);
    }
    On obtient :
    • 14--> carbone
    • 23--> zim
    • a--> Doe
    • b52--> boum
    • zzz--> badaboum

    On constate que les indices numériques s'affiche AVANT les indices alphanumériques !
    Intéressant...., non ?

    (et toujours PAS d'indice "zéro" en vue...)
    Dernière modification par Invité ; 02/03/2018 à 15h49.

  14. #14
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 739
    Points
    4 739
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    En continuant les tests... (c'est là ou je DETESTE JavaScript)

    Quand les index ne sont pas (tous) numériques :
    ....
    C'est QUOI ce binzz !?!?!

    et Object.keys(tbl).length => 3 ( dans les 2 cas) (@ Doksuri )


    Ouai, c'est un peu vicieux, (et c'est aussi pour cette raison q'on ne peut pas dire que JavaScript soit un langage fortement typé)

    En général on évite de mixer les "vrais tableaux" dont les indices [utilisables commencent à zéro] sont des nombres et les "faux tableaux" (dont les indices sont des clés) et qui en réalité sont des objets javascript (ou jso, mais sans le n à la fin)

    La raison de ce binzz est sans doute historique : à la naissance de JavaScript il ne devait exister que de "vrais tableaux", mais par la suite [j'imagine] avec la logique de l'implémentation du prototypage d'objets dans JavaScript, il y avait un peu double emploi entre les vrai et faux tableaux et ils ont en quelque sorte fusionné pour simplifier le travail sur les interpréteurs...
    On peu détester ou aimer, mais on trouvera toujours des curiosités dans tous les langages.

    D'ailleurs, le langage C est sans doute l'un des plus subtils (pour ne pas dire vicieux), ce qui n'empeche pas qu'il ne soit pas très largement "aimé" ...
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  15. #15
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 739
    Points
    4 739
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Heu, comment le dire autrement... Ben encore "non"...
    Les différents exemples montrent que les indices peuvent aussi être autre chose que des numériques... et à fortiori pas forcément d'indice "zéro" en vue...
    (et toujours PAS d'indice "zéro" en vue...)
    relis moi mieux stp :
    , Tableau_X.length ==> renvoi le nombre d'indices possibles sur "Tableau_X" ; le premier indice utilisable est égal à zéro, (pas à -15 [par exemple] )
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  16. #16
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Je n'ai pas encore tout lu mais je réagis par rapport au dernier message :
    Citation Envoyé par jreaux62 Voir le message
    Les différents exemples montrent que les indices peuvent aussi être autre chose que des numériques... et à fortiori pas forcément d'indice "zéro" en vue...
    Oui les indices peuvent être autres choses que des nombres et dans ce cas certains parlent de tableaux associatifs et d'autres n'aiment pas ce terme et disent que ce sont des objets. Je trouve que la frontière entre tableau et objet n'est pas toujours clair en JS (oui oui je sais on va me dire qu'un tableau c'est un objet mais bon vous voyez ce que je veux dire...).

    Après pour moi un vrai tableau ses indices doivent être tous numériques après si ce n'est plus le cas ou si il a des "trous" je crois que son usage devient plus lent (j'ai un doute mais dans ce cas je crois qu'il n'est plus vraiment considéré comme un tableau du point de vue de son traitement d'où la perte de vitesse...).

  17. #17
    Invité
    Invité(e)
    Par défaut
    @psychadelic
    Il faut te détendre... On n'est pas là pour savoir qui a les plus grosses*...

    Je ne remets pas en cause ce que tu as écrit.
    Je renvoie juste à la doc, et aux exemples.

    D'autre part, je ne pense pas que cette petite guéguerre intéresse vraiment pierrot10...
    Donc, cessons là.


    * connaissances, bien sûr

  18. #18
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 739
    Points
    4 739
    Par défaut
    @ jreaux62
    je laisse à ta réflexion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var tbl = [];
    tbl[-5] = 'moin5';
     
    console.log( 'taille tableau = ' + tbl.length );  // ==> taille tableau = 0
     
    for (var item in tbl ) {
      console.log( item + '--> ' + tbl[item]);  // ==>  -5--> moin5
    }
    ce qui montre bien que pour les "vrai tableaux" les indices commencent à zéro... (sinon la fonction tbl.length ne remplis plus son office).
    Ce n'est pas une guéguerre, c'est juste que c'est tres désagréable de sous entendre que je puisse écrire n'importe quoi
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  19. #19
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Vos échanges à tous sont intéressants et instructifs (en laissant de coté l'éventuel guéguerre).

    Je trouve aussi que la question du length est pertinente et déroutante, pour moi même si je suis un simple débutant, j'ose dire que c'est un défaut de JS, ce n'est pas normal et voilà c'est dit...

    Utiliser l'opérateur [] aussi pour les objets c'est vrai que c'est utile et bien commode mais du coup elle est source d’ambiguïté qu'on ne peut apparemment même pas dissiper en utilisant typeof et/ou Array.isArray()... Du coup en pratique je ne sais pas comment on peut savoir quand on a affaire à un vrai tableau où length joue le rôle qu'on attend de lui... Le savoir en dynamique avec typeof et/ou Array.isArray() apparemment ça marche pas alors est-ce que vous connaissez un éditeur dont l’assistance est capable de faire la différence ?

  20. #20
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Ah oui peut-être en comparant Object.keys(tbl).length et tbl.length ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/04/2008, 11h59
  2. [debutant] Comment commencer avec Perl?
    Par Murieyaya dans le forum Langage
    Réponses: 3
    Dernier message: 20/12/2005, 15h58
  3. Réponses: 3
    Dernier message: 07/04/2005, 15h04
  4. [Débutant]Commencer avec les BDD
    Par Pill_S dans le forum Débuter
    Réponses: 6
    Dernier message: 29/06/2004, 14h02
  5. [CR] Est il possible de créer des univers avec Seagate Info?
    Par Frank dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 27/06/2002, 15h22

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