Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment transformer un tableau en arguments varibables pour appeler une fonction ?

16 réponses
Avatar
Pascal Pensa
Bonjour,

Je suis confronté au petit soucis suivant:

J'ai un tableau

var tablo=[
["a","b"],
["x","y","z"],
....
]

et une fonction à arguments variables sur laquelle je veux appeler:

fct("a","b");
fct("x","y","z");
fct(...)

Comment faire pour transformer chaque sous tableau pour pouvoir appeler la
fonction à arguments varibles ?

Merci de votre aide, j'ai cherché un peu sur google mais là je sèche !
Pascal

6 réponses

1 2
Avatar
Cenekemoi
Bonjour à ASM qui nous a
YD wrote:

Je simplifierai en écrivant sur une ligne :
eval('fct("' + tablo[i].join('", "') + '")');


j'avais essayé :

fct("'" + tablo[i].join("', '") + "'");

et çà n'avait pas fonctionné ... toujours groupation des élements
faudrait peut-être passer par un replace apres un join() standard ?


On peut essayer :

fct( eval( '"'+ tablo[i].join('","') +'"' ) );

Pas beaucoup mieux et je ne sais pas si ça marche (d'ailleurs j'en
doute)...

--
Cordialement, Thierry ;-)


Avatar
ASM
YD wrote:

donc on en revient à :

var args = eval(tablo[i])

c'est çà ?



Encore non ;-)

Là, ça n'a pas de sens : eval attend une chaîne, sinon apparemment
il renvoie l'objet entré sans rien faire. Comme tu lui donnes un
objet Array...


Ouais, c'était un peut béta ...

au mieux çà équivaudrait à

var a, b, c;

Pourtant c'était vraiment élégant l'idée première ...

--
Stephane Moriaux et son [moins] vieux Mac


Avatar
YD

donc on en revient à :

var args = eval(tablo[i])

c'est çà ?


Encore non ;-)

Là, ça n'a pas de sens : eval attend une chaîne, sinon apparemment
il renvoie l'objet entré sans rien faire. Comme tu lui donnes un
objet Array...

--
Y.D.

Avatar
YD
YD wrote:

Je simplifierai en écrivant sur une ligne :
eval('fct("' + tablo[i].join('", "') + '")');


On peut essayer :


fct( eval( '"'+ tablo[i].join('","') +'"' ) );

Pas beaucoup mieux et je ne sais pas si ça marche (d'ailleurs j'en
doute)...


Tu as raison de douter : tu effectues eval sur une chaîne du type :
'"abc", "def", "ghi"'
Donc eval exécute comme si on écrit directement :
"abc", "def", "ghi"
le js exécute "abc" qui donne la valeur chaîne abc ;
c'est suivi par une virgule, on ne renvoie rien et on continue l'évaluation
de l'instruction, donc "def" qui équivaut à la valeur chaîne def ;
c'est suivi par une virgule, on ne renvoie rien et on continue l'évaluation
de l'instruction, donc "ghi" qui équivaut à la valeur chaîne ghi ;
on est arrivé au bout de l'expression avec les virgules on renvoie le dernier
résultat la valeur chaîne ghi.

Attention à la virgule en js qui a une signification complètement différente
selon qu'elle serve de séparateur de liste (pour les arguments d'une fonction,
pour l'initialisation d'un objet Array...) ou de séparateur d'instructions un peu
à la façon du ; mais dans ce cas seule la dernière valeur évaluée est renvoyée...

Pour être plus clair :
si on écrit : c=1,2,6;
à c est affectée la valeur numérique 1 puis js évalue 2 puis 6 mais n'en fait rien ;
si on écrit : c=(1,2,6);
c vaudra la valeur numérique 6 ! L'expression parenthésée est évaluée :
la dernière des valeurs séparées par une virgule est renvoyée puis affectée
à c.

Voilà pourquoi la seule façon de s'en sortir est d'écrire :
eval('fct("' + tablo[i].join('", "') + '")');
pour obtenir l'instruction complète à évaluer où la virgule sert bien de séparateur
de liste et non d'instructions.

Fin de la digression.

--
Y.D.



Avatar
Cenekemoi
Attention à la virgule en js qui a une signification complètement
différente selon qu'elle serve de séparateur de liste (pour les
arguments d'une
fonction, pour l'initialisation d'un objet Array...) ou de séparateur
d'instructions un peu à la façon du ; mais dans ce cas seule la
dernière valeur évaluée est
renvoyée...
Pour être plus clair :
si on écrit : c=1,2,6;
à c est affectée la valeur numérique 1 puis js évalue 2 puis 6 mais
n'en fait rien ; si on écrit : c=(1,2,6);
c vaudra la valeur numérique 6 ! L'expression parenthésée est évaluée
: la dernière des valeurs séparées par une virgule est renvoyée puis
affectée à c.

Voilà pourquoi la seule façon de s'en sortir est d'écrire :
eval('fct("' + tablo[i].join('", "') + '")');
pour obtenir l'instruction complète à évaluer où la virgule sert bien
de séparateur de liste et non d'instructions.


Merci de ces précisions qui m'avaient échappé

Fin de la digression.


Si tu insistes...je vais me prendre un café :-)

--
Cordialement, Thierry ;-)

Avatar
Pascal Pensa
"YD" a écrit dans le message de news:
4332a542$0$5407$

...
Voilà pourquoi la seule façon de s'en sortir est d'écrire :
eval('fct("' + tablo[i].join('", "') + '")');


Hello,

En effet c'est plus propre que ma double boucle :-)

Il va s'en dire que si j'avais le droit de toucher la fameuse 'fct' de ce
'kit' corporate j'aurais évité ce genre de bidouille... ce qui est d'autant
plus con qu'en ayant jetté un oeil dessus elle retransforme par la suite les
arguments[x] en tableau, bref... merci pour vos lumières anyway.

Pascal

1 2