[JS] Eval()

Pagina: 1
Acties:

  • Vinzzz243
  • Registratie: Februari 2001
  • Laatst online: 22-01-2025
In alle zoekresultaten op GoT lees je dat eval vies is, en vrijwel altijd kan worden vermeden en door betere functies kan worden vervangen...

Nu is mijn vraag, hoe kan ik de volgende sting "[['value1','tekst1'],['value2','tekst2'],['value3','tekst3']]"
zonder EVAL omzetten naar een 2dimensionaal array?

Verwijderd

Wie wil er dan ook in godsnaam zo'n string omzetten naar een twee dimensionale array? 8)7 Tuurlijk is eval daar de enige fatsoenlijke oplossing voor. Eval is vies, maar wat jij wilt is nog vele malen viezer. Kiezen tussen twee kwaden, dus kom je wel bij eval uit.

[ Voor 30% gewijzigd door Verwijderd op 14-05-2005 13:33 ]


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 19:46
Je stukje code omzetten kan je doen met string-functies als split. Je probleem ligt echter bij de bron die deze string aanlevert.

  • Vinzzz243
  • Registratie: Februari 2001
  • Laatst online: 22-01-2025
nou ok, misschien toch wel handig als ik de reden van de string uitleg...

ik wil het volgende doen.
Ik heb een pulldown select, waarbij de onchange een xmlhttp uitvoert. De target url moet dan iets terugretourneren...
Maar omdat ik een 2e select netjes wil opbouwen (createelement('option')) heb ik een javascript array nodig.
Ik dacht dus dat ik door die string aan te maken tijdens die xmlhttprequest, dat ik dan netjes op de huidige pagina dat array kon opsplitsen om via de dom options aan die 2e select toe te kennen...

andere manier beter?

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Je zou een serialized string kunnen teruggeven en die in javascript unserializen. Dat vind ik persoonlijk altijd wel een elegante oplossing :)

voorbeeld serialized string (zoals de serialize functie in PHP hem aanmaakt):
PHP:
1
2
3
4
5
6
7
8
$array = array( array('value1', 'tekst1'),
                array('value2', 'tekst2'),
                array('value3', 'tekst3')
);

echo serialize($array);

// a:3:{i:0;a:2:{i:0;s:6:"value1";i:1;s:6:"tekst1";}i:1;a:2:{i:0;s:6:"value2";i:1;s:6:"tekst2";}i:2;a:2:{i:0;s:6:"value3";i:1;s:6:"tekst3";}}


En dan met een mooie unserialize functie in javascript:
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
var serialized = 'a:3:{i:0;a:2:{i:0;s:6:"value1";i:1;s:6:"tekst1";}i:1;a:2:{i:0;s:6:"value2";i:1;s:6:"tekst2";}i:2;a:2:{i:0;s:6:"value3";i:1;s:6:"tekst3";}}';

var array = unserialize(serialized);

document.write('<pre>' + print_r(array) + '<\/pre>');


function unserialize(data)
{
    re = /(\w):([\d.]+)[:;]/g;
    return unserialize_do(data);
}

function unserialize_do(data)
{
    var cur, ret = '', i;
    if ((cur = re.exec(data)) !== null)
    {
        switch (cur[1])
        {
            case 'a':
                ret = [];
                i = cur[2];
                while (i--) ret[unserialize_do(data)] = unserialize_do(data);
                break;
            case 'o':
                ret = {};
                i = cur[2];
                while (i--) ret[unserialize_do(data)] = unserialize_do(data);
                break;
            case 's':
                ret = '' + data.substr(re.lastIndex+1, cur[2]);
                re.lastIndex += cur[2] - 1;
                break;
            case 'i':
                ret = cur[2] / 1;
                break;
            case 'd':
                ret = cur[2] / 1;
                break;
            case 'b':
                ret = cur[2] ? true : false;
                break;
        }
    }

    return ret;
}

function print_r(ar, ind)
{
    if (typeof ind == 'undefined') ind = '';
    var s = 'Array\n' + ind + '(\n';
    for (var i in ar)
    {
        if (typeof ar[i] == 'function' || typeof ar[i] == 'undefined') continue;
        s += ind + '\t[' + i + '] => ' + (typeof ar[i] == 'object' ? print_r(ar[i], ind+'\t') : ar[i]) + '\n';
    }

    return s + ind + ')';
}


:)

[ Voor 4% gewijzigd door crisp op 14-05-2005 15:16 ]

Intentionally left blank


  • Vinzzz243
  • Registratie: Februari 2001
  • Laatst online: 22-01-2025
hmm...
voor mij persoonlijk wat te ingewikkeld.

Denk dat ik gewoon van de string "'value1','tekst1';'value2','tekst2';'value3','tekst3'" maak en dan 2 x split, 1x op ";" en 1x op ","

dan krijg ik hem ook netjes binnen...

(misschien weet je NOG een manier crisp :) )

Ik heb nu dus:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
var responseArray = new Array(new Array());
responseArray = xmlhttp.responseText.split(";");
i = responseArray.length;
while (i--) 
{
    responseArray[i] = responseArray[i].split(",")
}
i = responseArray.length;
while (i--) 
{
    alert(responseArray[i][0] + ': ' + responseArray[i][1]);
}

met als string vanuit responseText -> <%="'value1','tekst1';'value2','tekst2';'value3','tekst3'"%>

[ Voor 53% gewijzigd door Vinzzz243 op 14-05-2005 16:10 ]


Verwijderd

waarom nou weer zonder eval, da's hetzelfde als een tabel compleet door divs willen opzetten omdatz e zeggen dat tabellen vies zijn.

Dit voorbeeld is precies waar eval voor bedoelt is, het is pas vies als je het toepast in iets als
code:
1
2
3
for (i=0; i<5; i++) {
  eval('curform = document.form'+i);
}

  • Vinzzz243
  • Registratie: Februari 2001
  • Laatst online: 22-01-2025
ik zal een functie schrijven voor het omzetten van dat array, dan kan ik het altijd nog aanpassen.

op deze url heb ik een voorbeeldje gezet, van wat ik nu heb. In xmlhttp.asp staat :
code:
1
<%="22,- - -;20,Piet;12,Boom;13,Vis;8,Vuur;9,Wip;10,Kees;7,Pim;23,Mies;24,Bal;25,Tol;21,Puk"%>

Dus nog niets dynamisch uit een db.

Is de code die ik gebruik prima om mee door te werken of is er enige kritiek op te uiten?
Pagina: 1