1. #1
    Membre habitué
    Profil pro
    Inscrit en
    juin 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2006
    Messages : 264
    Points : 141
    Points
    141

    Par défaut Equivalent fonction count() pour javascript

    Bonjour,

    Existe-il un équivalent de la fonction count() pour javascript, exemple:

    var tab = ["val1","val2","val3"]
    for (i=0;i<count(tab);i++) {
    alert(tab[i]);
    }
    Merci

  2. #2
    Invité
    Invité(e)

    Par défaut

    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var tab = ["val1","val2","val3"];
    for (i = 0; i < tab.length; i++) {
      alert(tab[i]);
    }
    A+

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    juin 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2006
    Messages : 264
    Points : 141
    Points
    141

    Par défaut

    c'est marrant length c'est comme c++...

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : janvier 2015
    Messages : 5
    Points : 6
    Points
    6

    Par défaut Pour information

    Pour information je tenais a spécifier que length ne correspond pas au nombre d'élément mais à la valeur du dernière indice +1

    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
     
    Array[5]
    0: 1.4128035320088301
    1: 1.4128035320088301
    2: 0.7078125
    3: 1.4128035320088301
    4: 1.4128035320088301
    length: 5
     
    Array[7]
    0: 1.4128035320088301
    1: 1.4128035320088301
    2: 0.7078125
    3: 1.4128035320088301
    4: 1.4128035320088301
    6: 1.5384615384615385
    length: 7
    Préférer cette fonction qui tient justement pas compte de la valeur de l'indice mais du nombre d'item


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        function count(array){
            var i = 0
            var count = 0;
     
            while(array[i] != undefined && i <= array.length+1){
                i++;
                if(typeof array[i] == undefined) continue;
                count++;
            }
     
            return count;
        }
    vive JS

  5. #5
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : septembre 2002
    Messages : 750
    Points : 1 178
    Points
    1 178

    Par défaut

    @callmarl. Je n'ai pas réussi à faire fonctionner ta fonction. Elle me renvoie toujours 0.

    En partant de ce que tu as écrit j'ai fait ça qui donne le nombre de postes ayant une valeur <> null.

    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
     
    <script>
    function count(array){
      var i     = 0;
      var count = 0;
      for (i=0;i < array.length;i++) if(array[i] != null) count++;
      return count;
    } 
     
    a = new Array();
    a[5]    = 4520;
    a[10]   = 10000;
    a[21]   = 500;
    alert(a);         // Liste les valeurs
    alert(a.length);  // Affiche 22
    alert(count(a));  // Affiche 3
    </script>
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : janvier 2015
    Messages : 5
    Points : 6
    Points
    6

    Par défaut Correction

    @badaze.
    En-effet merci de me le signalé j'ai fais une erreur dans la comparaison, il faut tester le string, j'en ai profiter pour l'optimiser :

    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
    (function(){
     
        function count(array){
            var i = 0;
            var count = 1;
     
            while(i < array.length){
                i++;
                if(typeof array[i] != "undefined") count++;
            }
     
            return count;
        }
     
     
        var test_array = new Array();
     
            test_array[0] = "un toto";
            test_array[1] = "deux toto";
            test_array[3] = "trois toto";
            test_array[8] = "quatre toto";
            test_array[17] = "cinq toto";
     
        console.log(test_array);
        console.log("length", test_array.length);
        console.log("count", count(test_array));
     
    })();

  7. #7
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    février 2009
    Messages
    5 728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Belgique

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

    Informations forums :
    Inscription : février 2009
    Messages : 5 728
    Points : 21 094
    Points
    21 094
    Billets dans le blog
    39

    Par défaut

    Citation Envoyé par ctrl+z Voir le message
    Existe-il un équivalent de la fonction count() pour javascript, [...]
    Oui, dans le JS d'aujourd'hui (ES2015 et +).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    let tab = ["val1","val2","val3"]
     
    for ( let item of tab ){
      console.log( item );
    }
    Si l'on a besoin de l'index :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for ( let [ i, item ] of tab.entries() ){
      console.log( i, item );
    }

    Blog



    Nota bene : si vous devez être compatible avec les navigateurs obsolètes (IE8 et plus), vous devez convertir les codes ES2015 en ES5 avec Babel.

    FAQ JS Tutoriels JS

    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.)

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : janvier 2015
    Messages : 5
    Points : 6
    Points
    6

    Par défaut Parcous de tableaux

    Hey, les deux fonctions que tu as donnés servent seulement à parcourir un tableau (certe la syntaxe est nouvelle) mais elle ne compte pas le nombre d'éléments dans le tableaux.

  9. #9
    Membre habitué
    Femme Profil pro
    Autre
    Inscrit en
    janvier 2017
    Messages
    99
    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 : 99
    Points : 152
    Points
    152

    Par défaut

    Bonjour,
    Tout dépend de si on se réfère simplement à la question initiale ou au code mis en exemple (parcours du tableau du premier index au dernier, que tous les index soient définis ou non).
    Si des index ne sont pas définis, une fonction "count" du style de php ne pourrait pas être utilisée pour une boucle comme dans l'exemple.
    La première réponse convenait donc bien pour l'exemple donné.
    Concernant le fait de faire un "count" façon php, le "for...in" paraît adapté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nb_=0;
    for(i in [,,2,undefined,null,,5,]) {nb_++;} //nb_=4
    On peut ajouter un test sur les clés dans le cas où il y aurait des propriétés énumérables indésirables.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : janvier 2015
    Messages : 5
    Points : 6
    Points
    6

    Par défaut

    Citation Envoyé par Loralina Voir le message
    Bonjour,

    Tout dépend de si on se réfère simplement à la question initiale ou au code mis en exemple (parcours du tableau du premier index au dernier, que tous les index soient définis ou non).
    Je crois qu'il faut que tu révise ce que faits la fonction count() ici, car count retourne le nombre d'élement d'un tableau (indexé ou avec tout autre type de clef) qu'il est des trou ou non dans les clef, de la meme facon que si tu cherche à obtenir le nombre d'elément d'un tableau en JS que tout les index soient définit ou non, je crois avoir dis des le début que c'est ce que fesait proprité length de l'objet Array() car length prends l'index de la dernière valeur d'un tableau et ajoute 1...

    Et sinon, tu execute ce code PHP et tu verra que count($array) affiche 3 est pas 6:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
    $array = [];
     
    $array[0] = 12;
    $array[4] = 1;
    $array[5] = 2;
     
    var_dump($array);
    var_dump(count($array));
    ?>
    Et perso je me réfère au sujet du post et à la question du premier post

  11. #11
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : septembre 2002
    Messages : 750
    Points : 1 178
    Points
    1 178

    Par défaut

    Il y a une grosse différence entre JS et PHP au niveau des tableaux.

    En PHP si tu mets $array[1000] = 10; il n'y aura qu'un seul poste dans le tableau. Si tu fais isset($array[1]) tu obtiendras false.
    En JS si tu crées l'Array array et que tu mets array(1000) = 10; les 1000 premiers postes existeront et auront la valeur null.

    Nom : 170310-003.JPG
Affichages : 1526
Taille : 62,4 Ko
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  12. #12
    Membre habitué
    Femme Profil pro
    Autre
    Inscrit en
    janvier 2017
    Messages
    99
    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 : 99
    Points : 152
    Points
    152

    Par défaut

    Bonjour badaze,
    les 1000 premiers postes existeront et auront la valeur null.
    Les index ne seront tout de même pas énumérables ?
    De plus dans votre code ici "if(array[i] != null) count++;", si on met la comparaison stricte "!==null", on est d'accord que "count" vaudra 22 ?


    callmarl :
    Je crois qu'il faut que tu révise ce que faits la fonction count() ici
    Je connais, oui, mais qu'y a-t-il dans ce que j'ai dit qui laisse penser le contraire ?
    Vraiment je ne vois pas, donc je tente au hasard :

    1) Quand je dis : "ou au code mis en exemple (parcours du tableau du premier index au dernier, que tous les index soient définis ou non)." :
    Je parle du code du premier message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var tab = ["val1","val2","val3"]
     for (i=0;i<count(tab);i++) {
     alert(tab[i]);
     }
    Si on considère la question sans le code, on peut être tenté de faire une fonction similaire au "count" de php, mais si on regarde l'exemple, on se dit que c'est plutôt "length" qui est recherché pour ce genre de boucle.

    2) Quand je dis : "Si des index ne sont pas définis, une fonction "count" du style de php ne pourrait pas être utilisée pour une boucle comme dans l'exemple." :
    Supposons qu'il y ait une fonction "count" comme php et adaptons l'exemple de départ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var tab = [];
    tab[1] = 123;
     for (i=0;i<count(tab);i++) {
     alert(tab[i]);
     }
    Il sera affiché "undefined" pour "i=0", mais pas la valeur 123 pour "i=1".
    A noter au passage que la fonction "count" sera appelée à chaque itération, ce qui n'est pas très optimisé (sauf si c'est voulu car par exemple le nombre d'éléments du tableau change dans la boucle).

    Et perso je me réfère au sujet du post et à la question du premier post
    Oui, je sais, et moi je disais que la première réponse et celle de danielhagnoul réagissaient, de mon point de vue, plus spécifiquement à la boucle "for" de l'exemple, pour laquelle un "count" qui ne comptabilise que les clés énumérables (ou éventuellement les valeurs différentes de undefined), ne permet pas de parcourir tous les index définis ou non.
    Où est le souci ?

    3) Le "for...in" que je propose ne convient-il pas ?
    Si j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var ar_=[];
    ar_[1]=0;
    ar_[3]=undefined;
    ar_[5]=123;
    delete ar_[5];
    J'attends d'une fonction "count" qu'elle me retourne 2 (index 1 et 3), ce que fait le "for...in" que je propose, mais c'est selon les objectifs, on peut préférer qu'elle retourne 1.

    4) Quand je dis, au sujet du "for...in" : "On peut ajouter un test sur les clés dans le cas où il y aurait des propriétés énumérables indésirables." :
    Dans la majorité des cas, on ne voudra comptabiliser que les clés qui sont des entiers positifs.
    Si on a défini des propriétés énumérables comme des fonctions, alors un test sur les clés est requis dans le "for...in".

    car length prends l'index de la dernière valeur d'un tableau et ajoute 1...
    On peut aussi avoir "tab=new Array(3)" ou "(tab=[]).length=3", "length" vaut 3, sans qu'il y ait d'index défini.

    A noter que dans votre fonction "count", le test commence à partir de "i=1", petite erreur à corriger.

  13. #13
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : septembre 2002
    Messages : 750
    Points : 1 178
    Points
    1 178

    Par défaut

    Citation Envoyé par Loralina Voir le message
    Bonjour badaze,

    Les index ne seront tout de même pas énumérables ?
    De plus dans votre code ici "if(array[i] != null) count++;", si on met la comparaison stricte "!==null", on est d'accord que "count" vaudra 22 ?
    Effectivement. Je n'avais pas envisagé la chose sous cet angle.

    Pour la comparaison stricte oui ça donne bien 22 à la lumière de l'énumérabilité la fonction se résume à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function count(array){
      var count = 0;
      for (var aa in array) count++;
      return count;
    }
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  14. #14
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    janvier 2011
    Messages
    11 893
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2011
    Messages : 11 893
    Points : 25 327
    Points
    25 327

    Par défaut

    @callmarl :
    (...) mais elle ne compte pas le nombre d'éléments dans le tableaux.
    non seulement tu déterres une discussion de plus de 8 ans mais en plus tu n'es pas capable de rajouter le compteur comme tu l'as fait dans ta fonction !

    De plus pour faire récent, on peux faire un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var tab=[1,,2,3,4,,,,,5];
    alert(tab.length);              // > 10
    alert(Object.keys(tab).length); // > 5

  15. #15
    Membre habitué
    Femme Profil pro
    Autre
    Inscrit en
    janvier 2017
    Messages
    99
    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 : 99
    Points : 152
    Points
    152

    Par défaut

    Bonjour,
    Citation Envoyé par NoSmoking Voir le message
    @callmarl :
    ...rajouter le compteur comme tu l'as fait dans ta fonction !
    Mettre le compteur "count" dans la boucle "for...of" de danielhagnoul, c'est bien ça ?
    Précisons alors qu'on obtiendra simplement la longueur "length" (à moins bien sûr d'ajouter un test sur la valeur ou l'index, mais ce n'est pas comparable au "for...in") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    let tab = new Array(5);
    tab[3]="a";
    let count = 0;
    for ( let [ i, item ] of tab.entries() ){
    	console.log( i, item );
    	/*if(tab.hasOwnProperty(i)===true)*/ count++;
    }
    console.log("nombre : "+count); //5
    C'est pour ça que je disais que l'intervention de danielhagnoul était dans la même optique que la première réponse avec "length".


    De plus pour faire récent, on peux faire un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var tab=[1,,2,3,4,,,,,5];
    alert(tab.length);              // > 10
    alert(Object.keys(tab).length); // > 5
    Bonne idée, oui.
    Pour les rares cas où il y a des propriétés énumérables autres que les index entiers positifs classiques, on peut revenir à "for...in" (ou autre méthode équivalente s'il y a) et ajouter un test comme je disais :
    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
    function count(ar_)
    	{
    	var i,nb_;
     
    	nb_=0;
    	for(i in ar_)
    		{
    		if(Math.abs(Math.floor(i))==i) //attention : à bien vérifier, voir lien ci-dessous
    			{
    			nb_++;
    			}
    		}
    	return nb_;
    	}
    var ar_=[,,1,,undefined,,null]; //3 éléments
    ar_.length=20;
    ar_.f=function(){}; //4ème élément
    Object.defineProperty(ar_,"test",{value:"tutu",enumerable:false}); //5ème élément
    console.log(count(ar_),Object.keys(ar_).length,ar_.test); //3 4 tutu
    Pour le test sur la clé, j'ai fait la première idée qui me venait, à voir s'il n'y a pas des cas particuliers où mon test est incorrect.
    Voir ce lien pour d'autres idées :
    http://stackoverflow.com/questions/1...sitive-integer

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Associations - ONG

    Informations forums :
    Inscription : janvier 2015
    Messages : 5
    Points : 6
    Points
    6

    Par défaut Je réponds seulement

    Je réponds seulement à une question, un équivalent de la fonction count(); qui je pense en C aurai également été crée en testant le typeof. M'enfin bon... D'autre pars ta proposition Object.keys(tab).length est judicieuse, et malgrès que le sujet date d'il y à 8 ans, les gens continu d'apprendre le JS et d'autre pars je suis tomber sur cet discussion en faisant une simple recherche google (fonction count() en JS) et qui plus ai dans les 3 premier lien google (d'ailleurs très bon référencement de developpez sur ce coup là ).

    Je n'ai pas compris ta remarque à propos de ma fonction count() étant donné quelle sort exactement le même résultat que ta proposition

    Bonne continuation, je pense que les prochaine personne qui tomberont comme moi sur ce vieux sujet et chercheront des réponse, l'auront et qui plus est de façon très très moderne.

  17. #17
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    janvier 2011
    Messages
    11 893
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2011
    Messages : 11 893
    Points : 25 327
    Points
    25 327

    Par défaut

    Citation Envoyé par Loralina
    Mettre le compteur "count" dans la boucle "for...of" de danielhagnoul, c'est bien ça ?
    Tout à fait!

    Citation Envoyé par callmarl
    ...malgrès que le sujet date d'il y à 8 ans,...
    Attention avec javascript même si les bases ne change guère il évolue quand même vite et souvent lorsque l'on débute il vaut mieux privilégier des sources récentes et commencer par ce documenter non pas sur bases de sources mais sur base du langage, méthodes misent à disposition.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/12/2010, 14h46
  2. utiliser fonction count($_POST) javascript
    Par Shivas dans le forum PHP & MySQL
    Réponses: 1
    Dernier message: 23/06/2010, 16h00
  3. equivalent fonction in_array() dans javascript
    Par sami117 dans le forum JavaScript
    Réponses: 1
    Dernier message: 30/03/2009, 10h58
  4. Equivalent des fonctions Windows pour WinCE
    Par bilel benhalima dans le forum Windows
    Réponses: 3
    Dernier message: 31/03/2008, 23h17
  5. Equivalent a fonction DATEDIFF pour MySQL version 3.23
    Par npze dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 31/10/2005, 11h18

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