2012-08-12 29 views
6

El siguiente código hace lo que quiero, pero me gustaría evitar eval. ¿Hay una función en Javascript que busca un objeto por su nombre como se define en una cadena?Obtiene objeto por nombre como cadena sin eval

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

un poco de contexto: Estoy usando esto para una aplicación en la que un gran número de nodos en el DOM tiene un atributo html5 data-object, que se utiliza en la función de controlador para conectar de nuevo al modelo.

Editar: myobject no es global ni local, se define en uno de los marcos principales del controlador.

+1

es 'myobject' una variable local o global? –

+0

¿Mantiene los datos de los modelos en las variables? No tengo mucha experiencia con MVC, pero generalmente desea mantener una referencia a sus modelos en sus vistas o colecciones ... –

Respuesta

13

Si las variables son globales a continuación:

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

DEMO

para Local:

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

DEMO

+0

@ ŠimeVidas Lo sé, señor, solo por el caso de OP. Gracias – thecodeparadox

+1

Su segundo ejemplo es un tipo de engañoso. Es básicamente el mismo que el primero: define 'myobject' sin' var' (significa: globalmente) y luego accede por 'window [myname]' (porque 'this === window', en su caso). En cuanto cambie su contexto (su 'this'), su ejemplo ya no funcionará. Para resumir: esa no es una forma de acceder a las variables locales por su nombre. – Loilo

11

local Solución variable:

usted podría hacer todos los objetos que desea acceder con unas propiedades de cadena de otro objeto. Por ejemplo:

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

y luego acceder a su objeto deseado de esta manera:

var desiredObject = objectHolder["myobject"]; 

Global Solution variable:

Puede acceder a las variables globales utilizando una cadena como esta:

window["myobject"]; 
+0

Es probable que haya olvidado reemplazar los signos de igual con dos puntos en la primera parte de su publicación. – darksky

+0

@darksky - Sí, lo hice. Gracias por señalar eso. – jeff

3

desde la ventana es un espacio de nombres global, que podría simplemente utilizar

window[myname] 
0

Esta pregunta es bastante viejo, pero ya que es el primer resultado en Google para la consulta "javascript obtener el objeto de cadena", pensé que me gustaría compartir una técnica para las rutas más largas de objetos utilizando la notación de punto.

Teniendo en cuenta lo siguiente:

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

podemos obtener el valor de 'alpha' de una cadena como esta:

var objPath = "bar.alpha"; 

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

    return object[property]; 
    }, foo); 

// alphaVal === "beta" 

Si es mundial:

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

sólo tiene que pasar window como initialValue para reduce:

var objPath = "foo.bar.alpha"; 

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

    return object[property]; 
    }, window); 

// alphaVal === "beta" 

Básicamente podemos utilizar para atravesar reduce miembros de objetos mediante el paso en el objeto inicial como el initialValue.

MDN article for Array.prototype.reduce

Cuestiones relacionadas