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 :

Array de fonctions


Sujet :

JavaScript

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 7
    Par défaut Array de fonctions
    Salut tout le monde!
    Je suis en train de me pencher sur l'intelligence artificielle en JS.
    j'aimerais déclarer un array qui contienne dans chaque case une fonction (un comportement pour être exact). J'ai essayé quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var comportements = 
    		[
     
    				alert1:function()
    					{
    					alert("comportement1");
    					},
    				alert2:function()
    					{
    					alert("comportement2");
    					}
    		];
    ou encore ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var comportements = 
    		{
     
    				alert1:function()
    					{
    					alert("comportement1");
    					},
    				alert2:function()
    					{
    					alert("comportement2");
    					},
    				tableau: [alert1(), alert2()];
    		};
    Une idée de comment je pourrais procéder?

  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 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    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 659
    Billets dans le blog
    1
    Par défaut
    oui ? et ?
    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
    var comportements = 
    		{
     
    				alert1:function()
    					{
    					alert("comportement1");
    					},
    				alert2:function()
    					{
    					alert("comportement2");
    					}
     
    		};
    comportements.alert1()
    comportements.alert2()
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    > La première syntaxe est un tableau de fonctions (enfin, "contenant" des fonctions, car à tout moment il pourrait contenir tout autre type de données)

    > La seconde syntaxe un objet dont les fonctions sont les propriétés. (qui peut donc fonctionner à peu près comme un espace de noms)

    Aucun problème technique avec tout ça, ça marche...

    >>> Je rejoins donc SF pour poser la question-clef : "et ensuite ?"

    (au fait juste en passant : un indentation comme ça, je pense que c'est de la dent de requin minimum , voire du T-Rex... encore un peu plus et il faudra un video-projecteur sur un mur de 10 metres pour lire ton code )

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 7
    Par défaut
    autant pour moi, j'ai pas assez détaillé le problème. Ce que je voudrais, c'est lancer un comportement de façon random, et de la manière la plus propre possible (exit donc un switch ou autre, sauf si j'ai vraiment pas le choix).

    je voudrais donc pouvoir lire un index aléatoire du tableau pour lancer le comportement correspondant.

    Si je ne définit ces fonctions que comme méthodes d'un objet, je ne peux pas (enfin je ne pense pas) y accéder via un quelconque index, non?



    Edit:
    Ah? Ben chrome me dit le contraire. dans le premier cas il me dit:
    "Uncaught SyntaxError: Unexpected token :" à propos du ":" de la première fonction, et dans le second, il me dit "Uncaught ReferenceError: alert1 is not defined"

  5. #5
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Il y a d'autres manières de procéder, mais pour ma part j'utilise ce genre de choses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // FONCTION : prend un élément au hasard dans le tableau courant
    // PARAM : (booléen) : si le param est présent et évalué "true", la fonction supprime du tableau courant l'élément désigné
    // RETOUR : l'élément désigné aléatoirement
    Array.prototype.puiser = function(vidage) {
       var jet = de(this.length) - 1;
       var retour = this[jet];
       if (vidage) this.splice(jet, 1);
       return retour;
    };
    et tu auras besoin de ça du coup (ou un équivalent, mais c'était pour donner un ensemble auto-suffisant ^^)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // FONCTION : simulation de jet de dé
    // PARAM : (number) : nombre de "faces"
    // RETOUR : entier aléatoire entre 1 et "max"
    function de(max) {
       if (max < 1) { return 0; };
       return Math.round((Math.random() * max) + .5);
    };

  6. #6
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Citation Envoyé par iraldir Voir le message
    Edit:
    Ah? Ben chrome me dit le contraire. dans le premier cas il me dit:
    "Uncaught SyntaxError: Unexpected token :" à propos du ":" de la première fonction, et dans le second, il me dit "Uncaught ReferenceError: alert1 is not defined"
    Oui oops j'ai lu trop vite, l'indentation a du m'induire en erreur
    Ce n'est qu'un problème de syntaxe :
    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
    //tableau de fonctions :
    var t = [
       function() {
          alert("1");
       },
       function() {
          alert("2");
       }
    ];
    //espace de noms :
    var o = {
       f1: function() {
          alert("1");
       },
       f2: function() {
          alert("2");
       }
    };

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 7
    Par défaut
    je réécris mon edit car je pense qu'il est passé inaperçu en fait:

    "Edit:
    Ah? Ben chrome me dit le contraire. dans le premier cas il me dit:
    "Uncaught SyntaxError: Unexpected token :" à propos du ":" de la première fonction, et dans le second, il me dit "Uncaught ReferenceError: alert1 is not defined""

    Sinon, ta fonction est globalement la même que celle que je compte utiliser, mais elle considère que j'ai en effet réussi à faire un array de fonction, non?

    En tout cas, merci à vous deux pour vos réponses rapides.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 7
    Par défaut
    Ah! J'ai pas testé encore mais ce serai la solution que ça ne m'étonnerais pas. Donc quand on définit une fonction dans un array, on ne doit pas lui donner de nom? (remarque, en y repensant c'est logique en fait).

    Merci bien! j'édit si ça marche.

    Edit: ça marche!!! Merci bien. Et si jamais quelqu'un tombe via google là dessus, et qu'il ne sait pas comment ensuite accéder à la fonction, c'est

  9. #9
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Citation Envoyé par iraldir Voir le message
    je réécris mon edit car je pense qu'il est passé inaperçu en fait:
    On est trop rapides comme mecs tous les deux pour utiliser correctement un forum

    Remonte

    Et arrête d'éditer (comme moi) sinon on va pas s'en sortiiiiiiir

  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 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    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 659
    Billets dans le blog
    1
    Par défaut
    sous chrome mon code au dessus fonctionne sans souci ...

    Sinon pour ton random

    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
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
    <script type="text/javascript">
    var comportements = { 
    				alert1:function()
    					{
    					alert("comportement1");
    					},
    				alert2:function()
    					{
    					alert("comportement2");
    					},
    				alert3:function()
    					{
    					alert("comportement3");
    					},
    				alert4:function()
    					{
    					alert("comportement4");
    					}
     
    		};
     
    function randomlaunch(){
     rand=Math.floor(Math.random()*4)+1		
    comportements['alert'+rand]()
    }
    </script>	
    <title>Nouvelle page 1</title>
    </head>
    <body>
    <input type="button" onclick="randomlaunch()" value='go' />	
    </body>
    </html>
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 7
    Par défaut
    (donc j'ai édité une dernière fois en haut pour dire que ça marchait )

    Sinon, SF, je ne pensais pas qu'on pouvait accéder à une méthode d'un objet via un index entre crochets. ça me fera une alternative au cas où, mais je pense garder la méthode Array, car ça me donne l'impression de mieux maîtriser l'index.

    En tout cas, merci à vous deux, une réactivité impressionante!

  12. #12
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Pour compléter l'exemple que je donnais, on aurait dans la partie head un bout de JS comme ça :
    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
    18
    19
    20
    21
    22
    23
    24
    var t = [
       function() {
          alert("1");
       },
       function() {
          alert("2");
       }
    ];
    // FONCTION : simulation de jet de dé
    // PARAM #1 : "max" (number) : nombre de "faces"
    // RETOUR : entier aléatoire entre 1 et "max"
    function de(max) {
       if (max < 1) { return 0; };
       return Math.round((Math.random() * max) + .5);
    };
    // FONCTION : prend un élément au hasard dans le tableau courant
    // PARAM : si présent et évalué "true", supprime du tableau courant l'élément désigné
    // RETOUR : l'élément désigné aléatoirement
    Array.prototype.puiser = function(vidage) {
       var jet = de(this.length) - 1;
       var retour = this[jet];
       if (vidage) this.splice(jet, 1);
       return retour;
    };
    et l'appel pourrait ressembler à :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="button" onclick="(t.puiser())();" />

  13. #13
    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 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    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 659
    Billets dans le blog
    1
    Par défaut
    en intégrant le random à l'array:

    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
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
    <script type="text/javascript">
    var comportements = { 
    				randomlaunch: function(){
     					rand=Math.floor(Math.random()*4)+1		
    					this['alert'+rand]()},
    				alert1:function()
    					{
    					alert("comportement1");
    					},
    				alert2:function()
    					{
    					alert("comportement2");
    					},
    				alert3:function()
    					{
    					alert("comportement3");
    					},
    				alert4:function()
    					{
    					alert("comportement4");
    					}
     
    		};
     
     
    </script>	
    <title>Nouvelle page 1</title>
    </head>
    <body>
    <input type="button" onclick="comportements.randomlaunch()" value='go' />	
    </body>
    </html>
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  14. #14
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    en intégrant le random à l'array:
    Ah oui tiens c'est pas mal non plus (juste faire gaffe à ne pas avoir besoin des vraies méthodes des tableaux, parce que là, on a plus de tableau du tout, c'est la solution objet/espace de noms ^^

    De plus, en insérant "le random" au prototype d'Array, on a pas besoin de retrimbaler la fonction de random dans chacun des "faux tableaux"... parce que j'imagine qu'il doit y en avoir plus d'un au final... non iraldir ?

    iraldir ?

    ...

    (samedi après-midi, il fait super beau, le posteur a eu réponse à son problème, et une heure plus tard on ergote encore pour... pour... le plaisir )

    >>> bon ben maintenant c'est sûr on est des malades

  15. #15
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Citation Envoyé par iraldir Voir le message
    je ne pensais pas qu'on pouvait accéder à une méthode d'un objet via un index entre crochets.
    Et t'avais raison car on ne peut pas.

    Une "méthode" ou plutôt propriété d'un objet n'a pas d'index. On peut l'appeller par son nom : ton_objet["nom_propriété"] mais on ne peut pas l'appeller via un quelconque index (ton_objet[1]). D'ailleurs l'objet en question n'a pas de propriété "length" qui permettrait de connaitre le nombre de propriétés déclarées.

  16. #16
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par défaut
    Citation Envoyé par Loceka Voir le message
    Et t'avais raison car on ne peut pas.

    Une "méthode" ou plutôt propriété d'un objet n'a pas d'index. On peut l'appeller par son nom : ton_objet["nom_propriété"] mais on ne peut pas l'appeller via un quelconque index (ton_objet[1]). D'ailleurs l'objet en question n'a pas de propriété "length" qui permettrait de connaitre le nombre de propriétés déclarées.
    C'est juste ^^

    Ca peut même être assez traitre : au cas où l'objet soit déclaré avec une fonction constructeur et non un littéral, length existera, mais renverra le nombre d'arguments attendus par la fonction

Discussions similaires

  1. Ajouter array à ma fonction
    Par Temjeh3 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 10/12/2014, 17h15
  2. Array et fonctions
    Par pol2095 dans le forum Android
    Réponses: 1
    Dernier message: 08/09/2013, 21h24
  3. Comment "mapper" un array en fonction des champs name d'un formulaire ?
    Par student_php dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 29/05/2013, 11h11
  4. Passer des Array à la fonction _call()
    Par bobic dans le forum Langage
    Réponses: 1
    Dernier message: 28/11/2010, 01h03
  5. Réponses: 15
    Dernier message: 16/09/2009, 16h19

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