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 :

Méthode inconnue avec un Array


Sujet :

JavaScript

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Lot (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 4
    Par défaut Méthode inconnue avec un Array
    Bonjour,

    Je commence avec javascript et venant du monde C++, je galère un peu.
    Le but de mon code est de faire un expand d'une chaine "5-12" en un array "5","6","7","8","9","10","11","12"
    voici mon problème

    Mes datas de test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    datatest = [{id:0,node:"0"},{id:1,node:"1-3"},{id:2,node:"5"},{id:3,node:"6-10"}]
    Mon code expandToArray protitype de String:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    String.prototype.expandToArray = function () {
      var d = this.valueOf();
      var out = '';
      if (d.split('-').length == 1) return d;
      var p = new Number;
      for (var i = parseInt(d.split('-') [0]); i <= parseInt(d.split('-') [1]); i++) {
        out = out + i + ',';
      }
      out = out.slice(0, - 1);
      return out.split(',');
    }
    test_1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    datatest.forEach ( function (d) {console.log(d.node)})
    0
    1-3
    5
    6-10
    undefined
    ok pour les datas si ce n'est ce undefined que je n'explique pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    datatest[1].node.expandToArray()
    ["1", "2", "3"]
    l'expandToArray fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    datatest[1].node.expandToArray()[0].constructor
    String() { [native code] }
    datatest[1].node.expandToArray().constructor
    Array() { [native code] }
    expandToArray renvoie bien un Array

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    datatest[1].node.expandToArray().forEach (function (d) {console.log(d)})
    1
    2
    3
    encore ok

    si je passe tous les enregistrement de data j'ai l"erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    datatest.forEach ( function (d) { d.node.expandToArray().forEach (function (d) {console.log(d)})})
    Uncaught TypeError: d.node.expandToArray(...).forEach is not a function(…)
    pourtant d.node est bien un String , je peu donc utiliser expandToArray, expandToArray est bien un Array je devrait pouvoir faire un forEach comme au dessus ???????

    Merci cordialement.

  2. #2
    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 : 74
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    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
    let datatest = [ { id : 0, node : "0"}, { id : 1, node : "1-3" }, { id : 2, node : "5" }, { id : 3, node : "6-10" } ];
        
    String.prototype.expandToArray = function(){
      let
        d = this.valueOf(),
        out = '',
        p = new Number;
        
      if ( d.split('-').length == 1 ) return [ d ]; // doit être un Array
      
      for ( let i = parseInt( d.split( '-' )[0], 10 ); i <= parseInt( d.split( '-' )[1], 10 ); i++ ){
        out = out + i + ',';
      }
      
      out = out.slice( 0, - 1 );
      
      return out.split( ',' );
    };
    
    document.addEventListener( 'DOMContentLoaded', function( ev ){
     
      datatest.forEach ( function( d ){
        d.node.expandToArray().forEach( function( k ){
          console.log( k );
        });
      });
      
    });

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

  3. #3
    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
    Par défaut
    Salut,

    Avec cette ligne là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(d.split('-').length==1)return d;
    , tu renvoies la String telle quelle s'il n'y a pas de tirets. Du coup, tu ne peux pas appeler forEach sur une String. Il faudrait retourner [d] dans ce cas pour toujours retourner une Array.

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

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    Citation Envoyé par renaudfrancois_orl Voir le message
    Bonjour,

    Je commence avec javascript et venant du monde C++, je galère un peu.
    Le but de mon code est de faire un expand d'une chaine "5-12" en un array...
    Bonjour il en va en Javascript comme avec tout langage même le C++
    un array est une structure de donnée et ce n'est pas une string
    alors quand je lis
    Citation Envoyé par renaudfrancois_orl Voir le message
    expand d'une chaine "5-12" en un array
    et
    Citation Envoyé par renaudfrancois_orl Voir le message
    j'avoue que je me pose des questions.

    j'imagine qu'en C++ tu aurais utilisé un int[] alors pourquoi utiliser une string et pas utiliser un tableau d'entier ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String.prototype.expandToArray = function () {
      var d = this.valueOf();
      var out = [];
      if (d.split('-').length == 1) return d;
      var p = new Number;
      for (var i = parseInt(d.split('-') [0]); i <= parseInt(d.split('-') [1]); i++) {
        out.push(i);
      }
      return out;
    }
    Ensuite tout comme en C++ il est préférable qu'une fonction retourne un type de donnée et un seul
    or dans ton code d est une String et out.split(',') est un tableau

    c'est comme si en C++ tu essayais d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int[] String::expandToArray() {
     String d = this;
     int[] out 
     if (d.notContaint('-')) return d;
     ....
     return out;
    }
    Tu va te chopper une erreur de compilation car ta méthode retourne un string au return d et un array au return out

    il suffit donc de retourner un tableau avec la valeur de la string
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    String.prototype.expandToArray = function () {
      var d = this.valueOf();
      var out = [];
      if (d.split('-').length == 1) {
         out.push(parseInt(d));
      } else { 
        var p = new Number;
        for (var i = parseInt(d.split('-') [0]); i <= parseInt(d.split('-') [1]); i++) {
          out.push(i);
        }
      }
      return out;
    }
    ainsi lorsque tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      datatest.forEach ( function( d ){
        d.node.expandToArray().forEach( function( k ){
          console.log( k );
        });
    si d.node contient une intervalle tu as un tableau avec plusieurs éléments
    et sinon tu as un tableau qui contient un élément.

    comme tu as toujours un tableau tu peut utiliser la méthode foreach
    A+JYT

Discussions similaires

  1. C# - appeler méthode fortran avec array
    Par azraec dans le forum C#
    Réponses: 0
    Dernier message: 12/04/2010, 16h34
  2. Réponses: 2
    Dernier message: 14/03/2008, 09h57
  3. probleme avec un array
    Par kaygee dans le forum ASP
    Réponses: 8
    Dernier message: 26/03/2007, 12h33
  4. Méthode Download avec le composant TNMFTP
    Par mattdef dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/10/2005, 06h48
  5. problème avec les array en pl/pgsql
    Par nico31120 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 04/03/2005, 16h04

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