Avatar billede -mundi- Nybegynder
22. oktober 2003 - 13:19 Der er 39 kommentarer og
1 løsning

kalde funktion samt parametre fra array

<script language="javascript">
    function add(){
        var result=0;
        for(var c =0;c<arguments.length;c++){
            result += arguments[c]
        }
        alert(result);
    }
    add('1',4,'6\'');
</script>

var marr= new Array();
marr[0]=add ; //her skal funktionen være
marr[1]=2;
marr[2]='';
marr[3]=6;

hvordan kalder jeg funktionen der ligger i marr[0], med de parametre der ligger i marr[1+] ? Og helst uden at skulle op i javascript, bemærk at parametrene godt kan indeholde ' og æ ø å
Avatar billede -mundi- Nybegynder
22. oktober 2003 - 13:20 #1
op i javascript = op i javascript 1.3
Avatar billede roenving Novice
22. oktober 2003 - 13:26 #2
<script language="javascript">
    function add(){
        var result=0;
        for(var c =0;c<add.arguments.length;c++){
if(add.arguments[c].length>1){
  for(var i=1;add.arguments[c].length>i;i++)result += add.arguments[c][i];
}else{
            result += add.arguments[c];
        }
        alert(result);
    }
    add('1',4,'6\'');
</script>

var marr= new Array();
marr[0]=add(marr) ; //her skal funktionen være
marr[1]=2;
marr[2]='';
marr[3]=6;
Avatar billede roenving Novice
22. oktober 2003 - 13:27 #3
Eller som rekursiv funktion:

    function add(){
        var result=0;
        for(var c =0;c<add.arguments.length;c++){
if(add.arguments[c].length>1)add(add.arguments[c]);
else result += add.arguments[c];
        alert(result);
    }
Avatar billede -mundi- Nybegynder
22. oktober 2003 - 13:50 #4
det er ikke meningen at functionen skal skrives om eller at arraynavnet på nogen måde skal hardkodes.

det kunne f.eks også være

marr[0]=alert; //her skal funktionen være
marr[1]='dette er en tekst der skal alertes';
Avatar billede roenving Novice
22. oktober 2003 - 13:59 #5
Men funktionen virker da stadig til det som den ellers bruges til -- og når du alligevel først i linjen skriver marr kan du vel også skrive det senere i linjen !-)
Avatar billede -mundi- Nybegynder
22. oktober 2003 - 14:06 #6
Det jeg er ude efter er at kalde funktionen der ligger i marr[0], med de parametre der ligger i marr[1],marr[2] .. marr[n]

ikke at lave om i funktionen add(), da den blot er et eksempel.
Avatar billede roenving Novice
22. oktober 2003 - 14:20 #7
Det nærmeste er at bruge marr.toString() der som regel vil levere en konkatenering af værdierne som tekststreng adskilt oftest med , (komma) ...

-- men det er browser- og styresystemsafhængigt !-)
Avatar billede -mundi- Nybegynder
22. oktober 2003 - 14:22 #8
det løser stadig ikke mit problem med at kalde den function der er i marr[0] med de parametre der er angivet i resten af arrayet
Avatar billede roenving Novice
22. oktober 2003 - 14:28 #9
Næh ...

-- men du kan ikke kalde en funktion med et ukendt antal parametre uden at sende det gennem en eller anden form for løkkestruktur !-)

-- så du skulle måske introducere en funktion mere:

function makeAdd(a){
res = "";
for(i=1;a.length>i;i++){
  res = add(res, a[i]);
}
return res;
}

og så:

marr[0] = makeAdd(marr);
Avatar billede -mundi- Nybegynder
22. oktober 2003 - 14:40 #10
hvad så hvis det er som det her :

marr[0]=window.open;
marr[1]='';
marr[2]='popup';
marr[3]='width=200,height=100';

en lykke struktur er helt fint, din makeAdd funktion kan bare ikke bruges i det her tilfælde, da den kun virker til en bestemt funktion og ikke kan anvendes på alle typer funktioner
Avatar billede roenving Novice
22. oktober 2003 - 14:47 #11
Aha, det er det du vil have, så må det blive:

function evaluateArray(a){
str = a[0];
if(a.length>1){
  str += "(";
  for(i=1;a.length>i;i++){
    if(typeOf a[i] == 'number')
      str += a[i];
    else
      str += "'" + a[i] + "'";
  }
  str += ")";
}
eval(str);
}

-- skal lige have checket hvad typeOf levererer på en string og et number, men ellers må det være sådan !-)
Avatar billede roenving Novice
22. oktober 2003 - 14:50 #12
-- og det skal være:

    if(typeof a[i] == 'number')
Avatar billede -mundi- Nybegynder
22. oktober 2003 - 14:51 #13
også hvis der er ' i nogen af parametrene ?
hvad så hvis det er som det her :

marr[0]=window.open;
marr[1]='';
marr[2]='popup\'s';
marr[3]='width=200,height=100';
Avatar billede roenving Novice
22. oktober 2003 - 15:05 #14
Nu er det et ekstremt dårligt eksempel, for "popup's" er en ugyldig html-identifier, så den er ulovlige som window-name parameter i window.open ...

-- men det kan selvfølgelig forekomme, så må man finde på noget, så det ikke sker !-)

-- og jeg tror ikke den kan _ikke_ hentes hjem 'for good' uden uforholdsmæssigt meget arbejde, så du må lave nogle regler for om du vil tillade ' eller "" -- i den ovenstående er det "" som er tilladt ...

-- der er forøvrigt en fejl i ovenstående:

function evaluateArray(a){
str = a[0];
if(a.length>1){
  str += "(";
  for(i=1;a.length>i;i++){
    if(typeof a[i] == 'number')
      str += a[i] + ",";
    else
      str += "'" + a[i] + "',";
  }
  str = str(str.substring(0,str.lastIndexOf(","))+")";
}
eval(str);
}

-- og forøvrigt kan man jo skrive en browser i javascript, dvs. en javascript-fortolker i javascript, så den kan klares !o]
Avatar billede -mundi- Nybegynder
22. oktober 2003 - 15:14 #15
lader spg være åbent lidt endnu, det kan være der er nogen andre som har noget input
Avatar billede olebole Juniormester
22. oktober 2003 - 21:46 #16
<ole>

Jeg har grundet lidt dårlig tid kun skimmet tråden kort. Det resulterer i to kommentarer:
1. I JavaScript kan/må man ikke bruge special-tegn - herunder æ, ø og å - så det bør dit array ikke indeholde.

2. JS-funktioner har en property 'arguments', som er et array, indeholdende de argumenter, funktionen er blevet kaldt med (ses meget brugt i MacroMedia's [f.eks. DreamWeaver] funktioner). Et eksempel kunne være:

function OleBoleSnask() {
  var a = arguments;
  for (i=0; i<a.length; i++) {
    alert(a[i])
  }
}

OleBoleSnask("Noget", "Noget andet", "Noget tredie");

/mvh
</bole>
Avatar billede -mundi- Nybegynder
23. oktober 2003 - 09:18 #17
Jo så langt er jeg nået, balladen går på om man på en eller anden måde kan tilføje parametre til en funktion uden om den almindelige parameter angivning
f.eks

marray[0]=minfunction;
marray[1]=param1;
marray[2]=param2;
marray[3]=param3

hvordan laves det om til

minfunction(param1,param2,param3)

roenving har foreslået opbygning af en streng ud fra de parametre der er angivet for til sidst at fyre en eval af ...

Men er der andre måder at gøre det på ? Jeg har siden spg blev stillet set at der findes en call metode der måske kan anvendes, men så vist jeg kunne se duer den kun i ie 5.5 og netscape 4+ (problemet er slf ie og ikke netscape)
Avatar billede olebole Juniormester
23. oktober 2003 - 10:22 #18
Nååhhh ... jamen, det er jo lige ud af landevejen:

var a = new Array(
    bla,
    "noget",
    "noget andet"
);
function bla(s1, s2) {
    alert(s1 +" og "+ s2);
}

a[0](a[1],a[2]);

/mvh
Avatar billede -mundi- Nybegynder
23. oktober 2003 - 10:31 #19
er der en måde at generalisere ovenstående kode, sådan at man i princippet kan kalde hvilken som helst funktion ?

hvis jeg nu har et multidimensionalt array der indholder functionsnavne og deres dertil hørende parametre.

marr[0][0]=alert;
marr[0][1]='Dette skal alertes';

marr[1][0]=minfunction;
marr[1][1]=parameter1;
marr[1][2]=parameter2;

hvordan griber jeg det an ?
Avatar billede olebole Juniormester
23. oktober 2003 - 10:50 #20
Jamen, den er da så generel, den kan blive ..... uden clairvoyance  ;o)
Jeg forstår ikke, hvordan det multidimensionale array skulle ændre på noget(?)  :)
/mvh
Avatar billede olebole Juniormester
23. oktober 2003 - 10:52 #21
Du bliver jo nødt til at definere, hvad funktionen skal gøre med de argumenter, den får med. En indbygget funktion - som alert() - får du ikke til at virke sådan uden en wrapper - eller clairvoyance  :)
/mvh
Avatar billede -mundi- Nybegynder
23. oktober 2003 - 10:57 #22
det var nu bare ment som eksempel

marr[0][0]=minførstefunction;
marr[0][1]=parameter1;

marr[1][0]=minAndenfunction;
marr[1][1]=parameter1;
marr[1][2]=parameter2;

Hele humlen er jeg har et array som ovenstående, og jeg vil gerne loope igennem, og udføre funktionerne med deres parametre.
Avatar billede olebole Juniormester
23. oktober 2003 - 12:20 #23
Jamen, det gør du da bare ... jeg forstår ikke problemet. Hvad er det, du ikke kan finde ud af?
Avatar billede -mundi- Nybegynder
23. oktober 2003 - 12:23 #24
marr[0][0]=minførstefunction;
marr[0][1]=parameter1;

marr[1][0]=minAndenfunction;
marr[1][1]=parameter1;
marr[1][2]=parameter2;

marr[2][0]=minTrediefunction;
marr[2][1]=parameter1;
marr[2][2]=parameter2;
marr[2][3]=parameter3;



for(var i=0:i<3;i++){
  marr[0](her skal parametrene være,og jeg ved ikke hvordan jeg skal variere antallet)
}
Avatar billede -mundi- Nybegynder
23. oktober 2003 - 12:24 #25
jeg kan slf lave noget i stil med :
for(var i=0:i<3;i++){
  marr[0](her skal parametrene være,og jeg ved ikke hvordan jeg skal variere antallet)
}
Avatar billede -mundi- Nybegynder
23. oktober 2003 - 12:27 #26
(damn tab+enter)
for(var i=0:i<3;i++){
  var temp=arguments.length;
  switch(temp){
    case 1:
      break;
    case 2:
      arguments[0](arguments[1]);
      break;
    case 3:
      arguments[0](arguments[1],arguments[2]);
      break;
  }
}

men der er ikke særligt elegant synes jeg ....
Avatar billede olebole Juniormester
23. oktober 2003 - 12:36 #27
Nej, der er vist også noget, du har misforstået med hensyn til 'arguments'  :)

Hvordan ville du gerne kunne kalde funktionen ... jeg forstår stadig ikke, hvad det er, du gerne ville kunne  :)
/mvh
Avatar billede -mundi- Nybegynder
23. oktober 2003 - 12:41 #28
der gik lidt ged i det, sidder med en del forskellige ting og kom til at blande 2 tin sammen, men her er et eksempel :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>Untitled</title>
</head>

<body>
<script language="JavaScript">
marr=new Array()
for(var i=0;i<3;i++){
    marr[i]=new Array();
}
marr[0][0]=first;
marr[0][1]='parameter1';

marr[1][0]=second;
marr[1][1]='parameter1';
marr[1][2]='parameter2';

marr[2][0]=third;
marr[2][1]='parameter1';
marr[2][2]='parameter2';
marr[2][3]='parameter3';

function first(){
    alert(arguments.length);
}
function second(){
    alert(arguments.length);
}
function third(){
    alert(arguments.length);
}

for(var j=0;j<marr.length;j++){
    switch(marr[j].length){
    case 1 :    break;
    case 2 :
        marr[j][0]((marr[j][1]));
        break;
   
    case 3:
        marr[j][0](marr[j][1],marr[j][2]);
        break;
   
    case 4:
        marr[j][0](marr[j][1],marr[j][2],marr[j][3]);
        break;
   
    }
}
</script>
</body>
</html>

er der ikke en mere smart måde at gøre det på ? hvis vi antager at der er 400 parametre, bliver det jo en del noller kode der skal laves
Avatar billede olebole Juniormester
23. oktober 2003 - 12:44 #29
Jamen, jeg fatter stadig ikke, hvad du vil med det - og så kan det jo blive svært at give et begavet bud på, hvad du skal gøre. Mit sidste forsøg på et gæt: Kan du bruge dette til noget:

var a = new Array( new Array() );
a[0][0] = bla;
a[0][1] = "noget";
a[0][2] = "noget andet";

function bla(a) {
    alert(a[1] +" og "+ a[2]);
}

a[0][0](a[0]);

/mvh
Avatar billede -mundi- Nybegynder
23. oktober 2003 - 12:58 #30
function first tager 1 parameter og ligger i marr[0][0]
function second tager 2 parameter og ligger i marr[1][0]
function third tager 3 parameter og ligger i marr[2][0]

opgaven går på : lav mig et loop der kan køre disse funktioner
Det er jo ligegyldigt hvad funktionerne laver, det er princippet bag at smide parametre på dynamisk
nederst i min kommentar har jeg lavet et eksempel på et loop, men det loop tilføjer jo ikke parametrene dynamisk og jeg vil få et problem hvis der pludseligt er 5 parametre i listen . Hvis jeg udvider loopet til at håndtere 10 parametre løber jeg ind i samme problematik ved 11 parametre osv osv

er det helt sort snak ?

marr=new Array()
for(var i=0;i<3;i++){
    marr[i]=new Array();
}
marr[0][0]=first;
marr[0][1]='parameter1';

marr[1][0]=second;
marr[1][1]='parameter1';
marr[1][2]='parameter2';

marr[2][0]=third;
marr[2][1]='parameter1';
marr[2][2]='parameter2';
marr[2][3]='parameter3';

for(var j=0;j<marr.length;j++){
    switch(marr[j].length){
    case 1 :    break;
    case 2 :
        marr[j][0]((marr[j][1]));
        break;
   
    case 3:
        marr[j][0](marr[j][1],marr[j][2]);
        break;
   
    case 4:
        marr[j][0](marr[j][1],marr[j][2],marr[j][3]);
        break;
   
    }
}
Avatar billede olebole Juniormester
23. oktober 2003 - 13:04 #31
Jamen, hvis ikke du vil indrette funktionen til det, bliver det umuligt, uden biologiske og selvtænkende JS-funktioner. Så har det vist ikke længere noget med scripting at gøre - men nærmere noget ESP-mumbo-jumbo  :)
Avatar billede -mundi- Nybegynder
23. oktober 2003 - 13:07 #32
det kunne jo være der var en eller anden appendparameter funktion eller create pseudo parameterliste ud fra et array og så array[n](hjemmestrikketpseudoliste)
Avatar billede olebole Juniormester
23. oktober 2003 - 13:10 #33
Jamen, din fuktion bliver da nødt til at vide, hvad den skal stille op med argumenterne
Avatar billede olebole Juniormester
23. oktober 2003 - 13:18 #34
Har du kikket på eksemplet (23/10-2003 12:44:51)?
Avatar billede -mundi- Nybegynder
23. oktober 2003 - 13:25 #35
ja, men jeg har åbenbart misforstået hvad det var der stod, du smider et array med som parameter ... Det kan slf være en løsning, ikke helt det jeg var ude efter til at starte med , men med lidt omskrivning kan det nok lade sig gøre alligevel :-)

Smid et svar, så jeg få lukket den her rodebutik :-)
Avatar billede olebole Juniormester
23. oktober 2003 - 13:31 #36
Ja, jeg smider bare hele 'under-arrayet' med. Næste ville så f.eks. hedde:
  a[1][0](a[1]);
Det tror jeg, er den simpleste måde at lave det på  :)
/mvh
Avatar billede roenving Novice
25. oktober 2003 - 02:45 #37
No comprende ?-)

-- ikke i tvivl om at -mundi- er blevet klogere, men hvor er svaret blevet mere kvalificeret ?o]
Avatar billede olebole Juniormester
25. oktober 2003 - 14:57 #38
Hehe ... nu har jeg fået læst hele tråden igennem igen - og vi er jo temmelig enige med ganske små nuance-variationer  :)

SOS ... Same Old Shit!  ;o)
  http://www.eksperten.dk/spm/418578
/mvh
Avatar billede roenving Novice
26. oktober 2003 - 10:00 #39
-- og velbekomme til -mundi- '-)
Avatar billede -mundi- Nybegynder
27. oktober 2003 - 09:06 #40
Jeg synes nu ikke at roenving' besvarelser er de samme som Oleboles , Roenvings løsninger var enten at lave om i min eksempel funktion eller at opbygge en streng ud fra et array for til sidst at køre en eval. Så jeg holder stadig på at mine points er gået til det rigtige svar. Hvad Olebole så vælger at gøre med sine point er jo hans egen sag
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester