2012-11-21 13 views
7

Esiste comunque, in modo nativo o tramite una libreria, l'uso dell'autovivificazione su oggetti Javascript?Esiste una libreria per supportare l'autovivificazione sugli oggetti Javascript?

IE, supponendo che foo sia un oggetto senza proprietà, è sufficiente eseguire foo.bar.baz = 5 anziché richiedere foo.bar = {}; foo.bar.baz = 5.

+4

Puramente nativamente, io non la penso così. 'undefined' non è estensibile o modificabile e si tratta dell'unico modo in cui potrei pensare di farlo senza passare attraverso una funzione. – Snuffleupagus

+2

No. Vedi http://stackoverflow.com/questions/7691395/autovivification-and-javascript – lbstr

+0

@ Ibstr, questa domanda, mentre si fa riferimento all'autorizzazione e JavaScript, non sta chiedendo la stessa cosa che sono. –

risposta

5

Non è possibile farlo esattamente con la sintassi che si desidera. Ma come al solito, in JS è possibile scrivere la propria funzione:

function set (obj,keys,val) { 
    for (var i=0;i<keys.length;i++) { 
     var k = keys[i]; 
     if (typeof obj[k] == 'undefined') { 
      obj[k] = {}; 
     } 
     obj = obj[k]; 
    } 
    obj = val; 
} 

così ora si può fare questo:

// as per you example: 
set(foo,['bar','baz'],5); 

senza preoccuparsi se bar o baz sono definiti. Se non ti piace il [..] nella chiamata di funzione puoi sempre scorrere l'oggetto arguments.

+0

Sto impostando valori di dizionario come set ('dict_obj', [0, 'User'], 5). Ma non posso restituire il valore che ho impostato usando una chiamata come "Console.log ('dict_obj [0] [' User ']) Non posso restituire il valore 5. Vedi qualche errore con come sto usando questo? – ouonomos

+0

@ouonomos: Stai sbagliando, stai impostando il valore sulla stringa ''dict_obj'' invece dell'oggetto' dict_obj'. – slebetman

+0

Mi scuso, ho sbagliato a digitare.Quello che sto facendo in realtà è: \t \t \t \t lastposxns = {}; \t \t \t \t grpname = 0; \t \t \t \t tempname = 'abc'; \t \t \t \t ypos = 5; \t \t \t dict_set (lastposxns [grp, tempname], ypos); dove dict_set è la funzione autoviv. Ma console.log (lastposxns [0] ['abc']) non restituisce il valore 5. – ouonomos

2

Puramente nativamente, non penso. undefined non è estensibile o modificabile e si tratta dell'unico modo in cui potrei immaginare di farlo senza passare attraverso una funzione.

0

Oppure è possibile utilizzare una soluzione basata su Eval. È brutto, non raccomandato.

function av(xpr) { 

    var res = ""; 
    var pos = 0; 
    while (true) { 

     var pos = xpr.indexOf("[",pos); 
     if (pos == -1) break; 
     var frag = xpr.substr(0,pos); 
     pos++; 

     res += "if (typeof(" + frag + ") != 'object') " + frag + " = {};\n"; 
    } // while 

    return res + xpr; 
} // av() 


function main() { 

    var a = {}; 
    a["keep"] = "yep"; 
    eval(av('a[1][1]["xx"] = "a11xx"; ')); 
    eval(av('a[1][2]["xx"] = "a12xx"; ')); 

    console.log(a); 
} // main() 
2

Avevo il desiderio di farlo, quindi ho scritto a package to handle it.

% npm install autovivify 
% node 
> Av = require('autovivify') 
> foo = new Av() 
{} 
> foo.bar.baz = 5 
5 
> foo 
{ bar: { baz: 5 } } 
> 

Sarà anche fare gli array con indici numerici:

> foo = new Av() 
> foo.bar.baz[0] = 'hum' 
> foo 
{ bar: { baz: [ 'hum' ] } } 
0

@ codice di slebetman non sembra funzionare. All'ultimo tasto non dovrebbe essere assegnato un oggetto vuoto, ma piuttosto lo val. Questo codice ha funzionato:

function autoviv(obj,keys,val) { 
    for (var i=0; i < keys.length; i++) { 
    var k = keys[i]; 
    if (typeof obj[k] === 'undefined') { 
     if(i === keys.length-1) { 
     obj[k] = val; 
     return; 
     } 
     obj[k] = {}; 
    } 
    obj = obj[k]; 
    } 
} 

foo = {} 
autoviv(foo,['bar','baz'],5); 
console.log(foo.bar.baz); 
5 
+0

Ciao Mark, ho dei dubbi, esiste un buon metodo per catturare screenshot usando angular js, se sì, puoi controllare questo https://stackoverflow.com/questions/44602309/making-a- corretta-image-capture-of-screen-con-jQuery –

Problemi correlati