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 :

Nombre d'éléments tableau


Sujet :

JavaScript

  1. #1
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut Nombre d'éléments tableau
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var table = new Array();
     
    table[0] = "Value 1";
    table[1] = "Value 2";
     
    alert(table.lenght); // Affiche 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var table = new Array();
     
    table[23] = "Value 1";
    table[102] = "Value 2";
     
    alert(table.lenght); // Affiche 103
    Dans l'exemple 2, comment faire pour renvoyer le nombre d'éléments réel dans le tableau? Donc 2

    Merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    L'attribut length des Array retourne le dernier index défini plus un. Si tu veux manipuler une table avec des index discontinus, un Object me paraît plus approprié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var table = { 23: "value 1", 102: "value 2" };
    alert(Object.keys(table).length);

  3. #3
    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 643
    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 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var table = new Array();
    table[23] = "Value 1";
    table[102] = "Value 2";
    cpt=0;
    for(elt in table){
        cpt++;
    }
    console.log(cpt);

  4. #4
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    Si tu veux garder l'Array, donc les trous, tu as des méthodes natives qui ne les énumèrent pas :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var arr = [];
    arr[23] = "Value 1";
    arr[102] = "Value 2";

    foreach : (sur le même principe some et every n'énumèrent pas non plus les trous)
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    arr.forEach(function (x,i) {
      console.log(i+'.'+x);
    });

    Le for ... in comme le mentionne Spacefrog.

    Si tu veux éliminer les trous d'un Array, utilise la méthode native filter :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var arrFiltre = arr.filter(function (x) {
      return true;
    });
     
    console.log(arrFiltre); // ["Value 1", "Value 2"]
    console.log(arrFiltre.length); // 2

    Mais attention, dans ce nouvel Array, les éléments auront respectivement l'index 0 et l'index 1. Non plus les index 23 et 102.
    Si tu veux garder des index précis pour tes valeurs, le meilleur moyen est d'utiliser la solution de Sylvain.

  5. #5
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut
    Merci pour vos réponses.

    En effet l'utilisation des objets semble plus approprié et vos solutions répondent à ma question et en plus j'ai appris des choses.

    Du coup cela me fait poser encore d'autres questions:

    • Objets VS Array: Y-a-t-il une différence de performance ou cela est du même?
    • Peut-on mettre un objet dans un objet comme pour les tableaux?
    • Peut-on faire un forEach sur un objet?


    Merci d'avance

  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 643
    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 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    Objets VS Array: Y-a-t-il une différence de performance ou cela est du même?
    J'ai pas testé, mais faudrait vraiment avoir de gros tableaux ou objets pour que la différence soit sensible.
    De plus cela doit aussi dépendre du traitement effectué sur le tableau ... (ça se benchmark, mais là j'ai pas le temps )

    Peut-on mettre un objet dans un objet comme pour les tableaux?
    oui

    Peut-on faire un forEach sur un objet?
    foreach n'existe pas en javascript
    on peut faire un for in ou avec jquery un .each voire bien plus ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    myjson ={"coucou":"hi!", "bonjour": "good morning"};
     
    $.each(myjson, function(clef, valeur){
        console.log (clef +" => "+ valeur);
                     })

  7. #7
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par SpaceFrog
    foreach n'existe pas en javascript
    Rhôôô... Spaffy !
    Le "core" JavaScript s'enrichit de nouvelles méthodes.

    Mais c'est uniquement une méthode de l'objet Array.

  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 643
    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 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    c'est là que je vois que je vieillis ...

  9. #9
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut
    Merci pour les réponses.

    En gros un for in est équivaux à un foreach?

    J'ai encore une autre questions/soucis, à l'instar de PHP, peut-on déclarer des tableaux "à la volé" sans les avoir initialisé, exemple j'aimerais faire la même chose en JS:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $table[] = "A01;A02;A03;23";
    $table[] = "B01;B02;B03;23";
    $table[] = "C01;C02;C03;102";
    $result = array();
    foreach($table as $row) {
        $col = explode(";", $row);
        $result[$col[3]][] = $col;    // Cette ligne que je n'arrive pas à reproduire en JS
    }

    Ce code me retourne un tableau à 2 dimensions:

    [23]
        [0]
            [0] => A01
            [0] => A02
            [0] => A03
            [0] => 23
        [1]
            [0] => B01
            [0] => B02
            [0] => B03
            [0] => 23
    [102]
        [0]
            [0] => C01
            [0] => C02
            [0] => C03
            [0] => 102
    Merci

  10. #10
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    encore une fois ceci n'est pas un tableau à deux dimension qui n'existent pas en php ou en js mais un tableau de tableaux
    je dirais même que c'est (3) un tableau de tableaux de tableaux

    quant à la question je ne suis pas sur d'avoir saisi
    mais la ligne php
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $result[$col[3]][] = $col;    // Cette ligne que je n'arrive pas à reproduire en JS
    a pour équivalent (en supposant que tu aies bien déclaré tes tableaux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result[col[3]].push(col);
    au passage en php aussi on a un push sur les tableau
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    array_push($result[$col[3]], $col);

    enfin il n'y a pour moi aucun intérêt à passer par un tableau une hashmap (tableau associatif) en php ou un objet en js est bien plus adapté
    d'ailleurs tu utilise bien un clef d'acces (string) et non un index (numerique)
    si je reprends ton algo php en JS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    table = []; // new Array
    table.push("A01;A02;A03;23");
    table.push("B01;B02;B03;23");
    table.push("C01;C02;C03;102)";
    result = {}; new HashMap
    for (row in table) {
        col = row.split(";");
        result[col[3]].push(col);    
        //tout comme en php col[3] est une String explode php ou split js 
        //retourne un tableau de string cela revient a écrire result["23"] et non result[23] 
    }

    A+JJYT

  11. #11
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut
    Bonjour,

    Merci pour votre réponse.

    J'ai bien essayé avec push() mais il me dit que la variable result[col[3]] est undefined, logique:

    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var rowCSV = [];
    var result = [];
    rowCSV[0] = "A01;A02;A03;23";
    rowCSV[1] = "B01;B02;B03;23";
    rowCSV[2] = "C01;C02;C03;102";
     
    rowCSV.forEach(function(value, key)
    {
        var col = value.split(";");
         result[col[3]].push(col);
     
    });

    Comment je peux faire pour lui dire que c'est un tableau?
    Ou alors si c'est plus simple en objet je suis preneur, mais là j'ai encore plus de peine.

    EDIT:

    J'ai essayé de déclaré mon tableau, mais du coup à chaque passage dans la boucle il le ré-crée

    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    rowCSV.forEach(function(value, key)
    {
        var col = value.split(";");
         result[col[3]] = new Array();
         result[col[3]].push(col);
     
    });

    Y-a-t-il un moyen de tester si result[col[3]] est déjà un tableau, alors ne pas faire de new Array();?

    Merci

  12. #12
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    Attention, result est un objet (hashmap). Il n'a pas de méthode push.

    Code javascript : 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
    var rowCSV = [];
    var result = {}; // /!\ hashmap
     
    rowCSV.push("A01;A02;A03;23");
    rowCSV.push("B01;B02;B03;23");
    rowCSV.push("C01;C02;C03;102");
     
    rowCSV.forEach(function(value, key) {
      var col = value.split(";");
      result[col[3]] = col; // /!\ hashmap
    });
     
    result; /*
      Object {23: Array[4], 102: Array[4]}
        23: Array[4]
        102: Array[4]
    */

  13. #13
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut
    Bonjour,

    Grâce à votre aide, j'ai trouvé une solution fonctionnelle:

    Code js : 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
     
    var rowCSV = [];
    var result = [];
    rowCSV[0] = "A01;A02;A03;23";
    rowCSV[1] = "B01;B02;B03;23";
    rowCSV[2] = "C01;C02;C03;102";
     
    rowCSV.forEach(function(value, key)
    {
        var col = value.split(";");
         if(typeof result[col[3]] == "undefined") {
               result[col[3]] = new Array();
         }
     
         result[col[3]].push(col);
     
    });

    Merci pour votre aide, mon problème est résolu, par contre je risque de revenir très vite pour d'autres soucis

  14. #14
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    rowCSV[0] = "A01;A02;A03;23";
    rowCSV[1] = "B01;B02;B03;23";
    rowCSV[2] = "C01;C02;C03;102";
    Mieux vaut utiliser push (voir mon code ci-dessus) et laisser le moteur JS s'occuper des index.

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(typeof result[col[3]] == "undefined") {
      result[col[3]] = new Array();
    }
     
    result[col[3]].push(col);
    Sauf que là encore result.length ne reflètera pas la taille réelle du tableau. (problème initial de cette discussion). Mieux vaut utiliser une hashmap ou tableau à deux dimensions comme tu l'appelles (voir mon code ci-dessus).

  15. #15
    Membre habitué
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2007
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2007
    Messages : 344
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par Kaamo Voir le message
    Sauf que là encore result.length ne reflètera pas la taille réelle du tableau. (problème initial de cette discussion). Mieux vaut utiliser une hashmap ou tableau à deux dimensions comme tu l'appelles (voir mon code ci-dessus).
    Oui en effet, mais comme je peux faire des foreach sur le tableau (ce que je savais pas avant), je n'ai plus besoin de cette information

    Merci

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

Discussions similaires

  1. Compter le nombre d'éléments d'un tableau
    Par Ishizaki dans le forum ASP.NET
    Réponses: 28
    Dernier message: 21/04/2008, 09h08
  2. nombre d'éléments pour un tableau
    Par sakura.haruno dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 10/12/2007, 09h11
  3. [Tableaux] nombre d'éléments du tableau
    Par helww dans le forum Langage
    Réponses: 2
    Dernier message: 03/04/2007, 19h58
  4. Nombre d'élément d'un tableau
    Par barok dans le forum Flash
    Réponses: 3
    Dernier message: 10/10/2005, 20h02
  5. Compter le nombre d'élément dans un tableau
    Par cryptorchild dans le forum Langage
    Réponses: 6
    Dernier message: 08/07/2005, 13h01

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