Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/08/2011, 12h59   #1
Invité de passage
 
Inscription : octobre 2010
Messages : 7
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 7
Points : 0
Points : 0
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 :
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 :
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?
iraldir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 13h09   #2
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 032
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 032
Points : 45 129
Points : 45 129
oui ? et ?
Code :
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
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


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 13h14   #3
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 573
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 573
Points : 4 075
Points : 4 075
> 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 )
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 13h14   #4
Invité de passage
 
Inscription : octobre 2010
Messages : 7
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 7
Points : 0
Points : 0
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"
iraldir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 13h19   #5
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 573
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 573
Points : 4 075
Points : 4 075
Il y a d'autres manières de procéder, mais pour ma part j'utilise ce genre de choses :
Code :
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 :
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);
};
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 13h23   #6
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 573
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 573
Points : 4 075
Points : 4 075
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 :
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");
   }
};
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 13h25   #7
Invité de passage
 
Inscription : octobre 2010
Messages : 7
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 7
Points : 0
Points : 0
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.
iraldir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 13h28   #8
Invité de passage
 
Inscription : octobre 2010
Messages : 7
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 7
Points : 0
Points : 0
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
iraldir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 13h29   #9
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 573
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 573
Points : 4 075
Points : 4 075
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
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 13h31   #10
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 032
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 032
Points : 45 129
Points : 45 129
sous chrome mon code au dessus fonctionne sans souci ...

Sinon pour ton random

Code :
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
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


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 13h37   #11
Invité de passage
 
Inscription : octobre 2010
Messages : 7
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 7
Points : 0
Points : 0
(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!
iraldir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 13h39   #12
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 573
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 573
Points : 4 075
Points : 4 075
Pour compléter l'exemple que je donnais, on aurait dans la partie head un bout de JS comme ça :
Code javascript :
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 :
<input type="button" onclick="(t.puiser())();" />
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 13h50   #13
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 032
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 032
Points : 45 129
Points : 45 129
en intégrant le random à l'array:

Code :
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
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


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 14h20   #14
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 573
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 573
Points : 4 075
Points : 4 075
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
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 11h07   #15
Membre Expert
 
Avatar de Loceka
 
Tlouye Ci
Inscription : mars 2004
Messages : 1 451
Détails du profil
Informations personnelles :
Nom : Tlouye Ci

Informations forums :
Inscription : mars 2004
Messages : 1 451
Points : 2 150
Points : 2 150
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.
Loceka est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 12h30   #16
Expert Confirmé Sénior
 
Avatar de RomainVALERI
 
Homme Romain VALERI
POOête
Inscription : avril 2008
Messages : 2 573
Détails du profil
Informations personnelles :
Nom : Homme Romain VALERI
Âge : 35
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : POOête

Informations forums :
Inscription : avril 2008
Messages : 2 573
Points : 4 075
Points : 4 075
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
__________________

...pour les linguistes et les curieux >>> générateur de phrases aléatoires

__________________
RomainVALERI est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h22.


 
 
 
 
Partenaires

Hébergement Web