[Javascript] Recursie in Javascript

Pagina: 1
Acties:
  • 101 views sinds 30-01-2008
  • Reageer

  • akakiwi
  • Registratie: September 2000
  • Laatst online: 20-03 11:13

akakiwi

I believe in the ruling class.

Topicstarter
Goede middag allemaal,

Weet iemand of het mogelijk is in Javascript een recursieve functie te schrijven?
Ik ben vanochtend een paar uur aan het pielen geweest, maar het lijkt erop dat Javascript recursie niet leuk vind.

Dit is de code die ik gebruik
variabelen
code:
1
2
3
4
5
6
7
8
var arrTabNames;
arrTabNames = new Array('Menu', 'A', 'Methodology', 'B', 'Library', 'C', 'Admin', 'D');
var arrTabNamesA;
arrTabNamesA = new Array('Homepage', 'AA', 'Search', 'AB', 'Support', 'AC', 'Logout', 'AD', 'Options', 'AE');
var arrTabNamesB;
arrTabNamesB = new Array('Consulting Services', 'BA', 'Resource Solutions', 'BB', 'E-Procurement', 'BC');
var arrTabNamesD;
arrTabNamesD = new Array('Methodology', 'DA', 'Documents', 'DB', 'Users', 'DC', 'Autorisation', 'DD', 'Recycle bin', 'DE', 'Support', 'DF', 'Styles', 'DG', 'Reports', 'DH', 'Weblog', 'DI');

aanroep
code:
1
createTabs(1, 2, 'arrTabNames', '');

functie
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function createTabs(iStartDepth, iDepth, sArrName, sTabs)
{
    var i, iArrLength, iCurrentDepth;
    var sCurrentTab;

    iArrLength = eval(sArrName +'.length');
//  alert(iArrLength);
    for(i = 0; i < iArrLength; i =  (i + 2))
    {
        sTabs = sTabs + '<span id="' + eval(sArrName + '[' + i + ']') + '" class="cToptab_off" onclick="init(' + i + ')" onmouseover="javascript:hilite(document.all.' + eval(sArrName + '[' + i + ']') + ');" onmouseout="javascript:dehilite(document.all.' + eval(sArrName + '[' + i + ']') + ');">' + eval(sArrName + '[' + i + ']') + '</span>';
//      alert(iStartDepth + ' < ' + iDepth);
        if(iStartDepth < iDepth)
        {
            iCurrentDepth = iStartDepth++;
            sArrName = sArrName + eval(sArrName + '[' + ((i * 2) + 1) + ']');
//          alert(sArrName);
            createTabs(iCurrentDepth, iDepth, sArrName, sTabs);
        }
    }
    MenuTabs.innerHTML = sTabs;
//  alert(sTabs);
}

Deze code kun je gewoon draaien om te zien wat ie doet.

Alvast bedankt.

| Life is a game (and games are fun) | homepage |


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

recursie kan net zo makkelijk in JS als in andere talen.. dus zal wel wat in je code zitten..

ik kijk er ff naar.. :P

update... "eval" is nogal een lelijke oplossing.. kun je niet beter met multidimensional arrays werken? Dus simpel gezegd, arrays in arrays? Dat maakt het programmeren van een recursieve functie ook wat makkelijker en overzichtelijker...

Maak na de pauze (eerst gamen!!!) wel ff een voorbeeld. Als niemand anders me dan al voor geweest is ;)

  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 22-06 13:51

Clay

cookie erbij?

Recursie gaat idd prima, je moet alleen wel uitkijken dat je die functie ook op laat houden als dat wat ie moet doen niet lukt of niet gevonden wordt of trouwens toch.

Ik gebruik voor Ns4 bijvoorbeeld vaak een recursieve layer zoeker (van brainjar, voor nested layers) die een layer kan vinden als die bestaat. en in js games zijn ook tal van voorbeelden te verzinnen waar recursie handig is.

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


  • akakiwi
  • Registratie: September 2000
  • Laatst online: 20-03 11:13

akakiwi

I believe in the ruling class.

Topicstarter
Het lag idd aan mijn functie.
Hij werkt nu best lekker, alleen is er nu weer een nieuw probleem. :<

Met die recursieve functie wil ik een String teruggeven. Zoiets als:
function blaat(i)
{
i = i + 1;
blaat = i;
}
Maar dan met die functie van hierboven.
Als je dan binnen de functie de waarde van blaat oproept, dan heeft die inderdaad gewoon de waarde van i, maar als je blaat in een variabele zet doormiddel van de aanroep (alert(blaat(0);)), dan is ie altijd UNDEFINED.
Moet ik misschien expiciet tegen de functie zeggen dat ie een String terug moet geven??

| Life is a game (and games are fun) | homepage |


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

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
<html>
<body>
<script>

Array.prototype.isArray=true;

arrDB=new Array(
    [1,2,3,4,5],
    [6,7,8],
    [9,10,11,12,13,14],
    [15,16]
);

function listItems(arr){
    for(var i=0;i<arr.length;i++){
        if(arr[i].isArray) listItems(arr[i]);
        else document.write(arr[i]+"<br>");
    }
}

listItems(arrDB);

</script>
</body>
</html>

even voorbeeldje..geeft je gewoon de inhoud van de array(s) netjes in de goede volgorde, hoe diep je ze ook nest. Dit werkt ook gewoon met strings.. snap verder niet helemaal wat je daar mee bedoelt.. leg eens uit?

ps. het Array.prototype.etc is om te kunnen zien of het om een array gaat of wat anders.. string heeft namelijk ook atribuut "length" :P

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

Weet niet of het aan onze provider lag, maar de hele middag lag alles van trueserver deruit :P
Moet ik misschien expiciet tegen de functie zeggen dat ie een String terug moet geven??
Kon dat maar.. das nu een van de vele tekortkomingen van JavaScript. JS maakt geen onderscheid tussen typen variabelen. Hoewel dat je een hoop gedoe scheelt wat betreft casten enzo, geeft het mij ook enorme irritaties dat ik geen overloading e.d. van functies kan gebruiken.. :(

scripting sux... maar goed.. daar ging deze topic niet over ;)

  • Clay
  • Registratie: Oktober 1999
  • Laatst online: 22-06 13:51

Clay

cookie erbij?

Ik vind scripting niet sucken, maar daar gaat deze topic niet over, dus :) Maar je kan overloaden toch "faken" door zelf op type te checken?
code:
1
2
3
4
5
var dinges = [0, 1, 'a', [1,2,3], null];

for(var i=0; i<dinges.length; i++) {
    alert(typeof dinges[i])
}

je functies gaan er wat slordig uitzien, maar het kan dus wel. Zo kan je overerving ook wel faken. In Netscape is er dacht ik zelfs een call() functie die een soort overerving doet.

Instagram | Flickr | "Let my music become battle cries" - Frédéric Chopin


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

je functies gaan er wat slordig uitzien
Mocht het nut van overloaden nu net overzichtelijke code zijn ;) Nou ja.. in scripting waar "size does matter" scheelt het je ook bestandsgrootte... m'n JS-code ziet er toch al niet uit om alles zo klein mogelijk te houden :)

Wat ik bedoelde met scripting sux is meer dat het beperkt is in vergelijking met een echte programmeertaal.. als je met beide werkt (jij bent toch ook wel behoorlijk bekend met andere echte OO-talen) irriteert het simpele en heirdoor beperkte van scripting je wel eens..

Overerving van objecten kun je in JS dus ook gewoon doen met prototype.. is wel omslachting, maar werkt prima..

Ow.. hier staat er een stukkie over:
http://www.webmasterbase.com/article/473/91
Pagina: 1