[js] array deleten / global, local; conflict ?

Pagina: 1
Acties:

  • r0bert
  • Registratie: September 2001
  • Laatst online: 11-08 16:19
Ik heb een leuk zoekfunctietje gebouwt in js die wat arrays en objecten doorbladert en de resultaten in de array arrResult zet. Maar nu wil ik als er meerdere zoekacties uitgevoert worden, dat de resultaten van de vorige zoekactie natuurlijk gedelete worden.

heb al op verschillende manieren geprobeerd, maar 't wil maar niet lukkeh..

eerst maar even de zoekfunctie:
PHP:
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
var arrResult = new Array();

function fnSearch(argDataSource, argSearchFor, arg1, arg2, arg3) {

   // ga door iedere 'child'/index van de datasource
   for (strVar in argDataSource) {
   
      // als het type variabele een Array is, heeft het nog geen objecten. Dus als 
      // we niet op kolom1, kolom2 of kolom3 zoeken, hebben we hier nog nix 
      // aan.. dus moeten we nog 1 level dieper

    if ((argDataSource[strVar].constructor.toString().match('Array') == 'Array') && (!argSearchFor.indexOf('Kolom') > -1)) {
        if (arg1) fnSearch(argDataSource[strVar], argSearchFor, arg1, strVar);
        else fnSearch(argDataSource[strVar], argSearchFor, strVar);
    }
      
      // als we op kolom* zoeken, en de waarde van het textfield is 
      // gelijk aan die van de huidige index >>
     
     else if (((argSearchFor.indexOf('Klas') > -1) || (argSearchFor.indexOf('Dag') > -1) || (argSearchFor.indexOf('Uur') > -1)) && (arg1) && (arg2)) {
        if ((argSearchFor = 'Klas') && (arg1 == document.getElementById('txt'+ argSearchFor).value)) arrResult[++arrResult.length] = new fnResult(arg1, arg2, strVar, eval('argDataSource[strVar]').id);
        else if ((argSearchFor = 'Dag') && (arg2 == document.getElementById('txt'+ argSearchFor).value)) arrResult[++arrResult.length] = new fnResult(arg1, arg2, strVar, eval('argDataSource[strVar]').id);
        else if ((argSearchFor = 'Uur') && (strVar == document.getElementById('txt'+ argSearchFor).value)) arrResult[++arrResult.length] = new fnResult(arg1, arg2, strVar, eval('argDataSource[strVar]').id);
      
      // als we niet op kolom* zoeken, maar op een andere factor
      // vergelijk het bijbehorende object met de waarde van het 
      // bijbehorende textfield >>
      } else if (eval('argDataSource[strVar].' + argSearchFor.toLowerCase()) == document.getElementById('txt'+ argSearchFor).value) 
            arrResult[++arrResult.length] = new fnResult(arg1, arg2, strVar, eval('argDataSource[strVar]').id);
   }
}


een paar manieren die ik al geprobeerd heb:

PHP:
1
2
<input type="button" name="btnZoek" value="Nu zoeken.." 
           onClick="arrResult.length = 0; fnSearch(data, fnRadioValue('radZoekenOp')); fnSResult(arrResult);" />

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<input type="button" name="btnZoek" value="Nu zoeken.." 
           onClick="fnEmptyArray(arrResult); fnSearch(data, fnRadioValue('radZoekenOp')); fnSResult(arrResult);" />

..  de bijbehorende functie: ..

function fnEmptyArray(arrResult)
{
    for (strIets in arrResult)
    {
        delete arrResult[strIets];
        fnEmptyArray(arrResult[strIets]);
    }
}

.. of ..

function fnEmptyArray(arrResult)
{
    for (strIets in arrResult)
    {
        arrResult[strIets] = null;
        fnEmptyArray(arrResult[strIets]);
    }
}

PHP:
1
2
<input type="button" name="btnZoek" value="Nu zoeken.." 
           onClick="arrResult = new Array; fnEmptyArray(arrResult); fnSearch(data, fnRadioValue('radZoekenOp')); fnSResult(arrResult);" />


Ik dagt dat het er misschien aan zou liggen dat ie binnen de functie de array arrResult van de vorige zoekactie hergebruikt, en ik alleen de globale array delete (en dat ie dus de lokale gebruikt)

hoop dat m'n probleempje beetje duidelijk is..

[ Voor 0% gewijzigd door r0bert op 12-08-2002 11:49 . Reden: var arrResult = new Array(); vergeten ]


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

Bosmonster

*zucht*

Je kunt variabelen en objecten resetten door ze op null te zetten.

arrResult = null

Maar ondanks dat is het misschien een stuk handiger om de functie gewoon een Array te laten returnen ipv een globale Array te vullen en overschrijven. Dan ben je ook van het hele probleem af.

  • r0bert
  • Registratie: September 2001
  • Laatst online: 11-08 16:19
Jah, maar het is een recursieve funtie toch ? Dan krijg ik weer een multidimensionale array terug (of denk ik nu verkeerd).. want dan moet ik namelijk mijn hele script weer aanpasseh :S

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

Bosmonster

*zucht*

Juist recursief werkt toch met return waarden? Om het aloude findObj() voorbeeld maar weer boven tafel te halen :) :

PHP:
1
2
3
4
5
6
7
8
9
10
function findObj(id,d){
    for(var i=0;i<d.layers.length;i++){
        var obj=d.layers[i];
        if(obj.name==id) return obj;
        if(obj.document.layers.length>0){   
            obj=findObj(id,obj.document);
            if(obj!=null) return obj;
        }
    }   return null;
}


En wat je doet met de waarden die je terugkrijgt ben je vrij in natuurlijk.. je zou bijvoorbeeld deze aan elkaar vast kunnen plakken.. maar hou het in de functie wel lokaal..

Een functie zou eignelijk nooit van globale variabelen afhankelijk mogen zijn.

  • r0bert
  • Registratie: September 2001
  • Laatst online: 11-08 16:19
Ik dacht dat je letterlijk 'arrays returnen' bedoel zoals je zei

PHP:
1
2
3
4
5
6
7
8
function fnName(iLevel)
{
    var theArray = new Array('1','2');

    if (iLevel < 5) arrArr = fnName(++iLevel);

    return theArr;
}

dan krijg je dus een array als arrArr[0][1][1][0][1] = 2; ofzo.. (lul nu maar wat maar hopelijk is het duidelijk wat ik bedoel)

moet nu ff weg.. reply nog wel ff weer als ik terug ben ..