2012-08-12 15 views
6

Il codice seguente fa quello che voglio, ma vorrei evitare eval. Esiste una funzione in Javascript che ricerca un oggetto con il suo nome come definito da una stringa?Ottieni oggetto per nome come stringa senza eval

myobject = {"foo" : "bar"} 
myname = "myobject"; 
eval(myname); 

po 'di contesto: Sto usando questo per un'applicazione in cui un gran numero di nodi nel DOM ha un attributo HTML5 data-object, che viene utilizzato nella funzione di gestore di connettersi al modello.

Modifica: myobject non è né globale né locale, è definito in uno dei frame principali del gestore.

+1

è 'myobject' una variabile locale o globale? –

+0

Mantenete i dati dei modelli in variabili? Non ho molta esperienza con MVC, ma di solito vuoi mantenere un riferimento ai tuoi modelli nelle viste o raccolte ... –

risposta

13

Se le variabili sono globali, allora:

myobject = {"foo" : "bar"}; 
myname = "myobject"; 
window[myname].foo 

DEMO

Per locale:

(function(){ 
    myobject = {"foo" : "bar"}; 
    myname = "myobject"; 
    alert(this[myname].foo); 
})(); 

DEMO

+0

@ ŠimeVidas Conosco Sir, solo per il caso dell'OP. Grazie – thecodeparadox

+1

Il tuo secondo esempio è una sorta di fuorviante. È fondamentalmente uguale al primo - definisci 'mioobject' senza' var' (significa: globalmente) e poi accedilo da 'window [myname]' (perché 'this === window', nel tuo caso). Non appena il tuo contesto (il tuo 'questo') cambia, il tuo esempio non funzionerà più. Per farla breve: non è un modo per accedere alle variabili locali per nome. – Loilo

11

locale Soluzione variabile:

Si potrebbe fare tutti gli oggetti che si desidera accedere con le proprietà di stringa di un altro oggetto. Per esempio:

var objectHolder = { 
    myobject: {"foo" : "bar"}, 
    myobject2: {"foo" : "bar"}, 
    myobject3: {"foo" : "bar"} 
}; 

e quindi accedere l'oggetto desiderato in questo modo:

var desiredObject = objectHolder["myobject"]; 

Global Solution variabile:

È possibile accedere alle variabili globali utilizzando una stringa come questa:

window["myobject"]; 
+0

Probabilmente hai dimenticato di sostituire i segni di uguale con i due nella prima parte del tuo post. – darksky

+0

@darksky - Sì, l'ho fatto. Grazie per la segnalazione. – jeff

3

dal finestrino è un namespace globale, si può semplicemente utilizzare

window[myname] 
0

Questa domanda è piuttosto vecchio, ma dal momento che è il risultato superiore su Google per la query "javascript ottenere l'oggetto dalla stringa", ho pensato di condividere una tecnica per i percorsi più lunghi degli oggetti usando la notazione punto.

Dato il seguente:

var foo = { 'bar': { 'alpha': 'beta' } }; 

possiamo ottenere il valore di 'alpha' da una stringa come questa:

var objPath = "bar.alpha"; 

var alphaVal = objPath.split('.') 
    .reduce(function (object, property) { 

    return object[property]; 
    }, foo); 

// alphaVal === "beta" 

Se è globale:

window.foo = { 'bar': { 'alpha': 'beta' } }; 

basta passare window come initialValue per reduce:

var objPath = "foo.bar.alpha"; 

var alphaVal = objPath.split('.') 
    .reduce(function (object, property) { 

    return object[property]; 
    }, window); 

// alphaVal === "beta" 

Fondamentalmente si può usare reduce attraversare membri di oggetto passando nell'oggetto iniziale come initialValue.

MDN article for Array.prototype.reduce

Problemi correlati