Analizar la notación de puntos del objeto para recuperar un valor de un objeto.

Me encuentro luchando con un pequeño problema. Digamos que tengo un objeto:

var foo = { bar: { baz: true } }; 

Ahora también tengo un String 'foo.bar.baz' . Ahora me gustaría recuperar el valor del objeto utilizando la cadena.

Tenga en cuenta: este es solo un ejemplo, la solución debe ser dinámica.

Actualizar:

Necesito que el nombre de la variable también sea dynamic y analizado desde la cadena. Tampoco puedo estar seguro de que mi variable sea una propiedad de la ventana.

Ya he construido una solución usando eval , pero creo que esto es bastante feo: http://jsfiddle.net/vvzyX/

4 Solutions collect form web for “Analizar la notación de puntos del objeto para recuperar un valor de un objeto.”

Aquí es cómo puede hacer esto:

 function getValue(namespace, parent) { var parts = namespace.split('.'), current = parent || window; for (var i = 0; i < parts.length; i += 1) { if (current[parts[i]]) { current = current[parts[i]]; } else { if (i >= parts.length - 1) return undefined; } } return current; } var foo = { bar: { baz: true } }; console.log(getValue('foo.bar.baz')); //true 

El primer argumento de la función es el espacio de nombres (valores separados por puntos) y el segundo es el objeto parent , si no se proporciona el principal, se utiliza la window .

Un ejemplo más usando el argumento padre:

 var str = 'foo.bar.baz'; foo = { bar: { baz: true } }; result = getValue(str, foo); console.log(result); 

Aquí hay un ejemplo en jsfiddle .

Se usa un enfoque similar en YUI. Su enfoque se llama patrón de espacio de nombres. El principal beneficio es la simulación de paquetes / espacios de nombres. La única diferencia entre este script y el patrón de espacio de nombres es que la función de espacio de nombres crea una estructura anidada en lugar de solo devolver el valor.

Por ejemplo,

 function get(obj, path) { return path.split('.').reduce(function(obj, p) { return obj[p] }, obj); } 

Manifestación:

 tree = { foo: { bar: 1, baz: { quux: 3 }, }, spam: 1 } console.log(get(tree, 'foo.baz.quux')) // 3 

Prueba esto:

 var name = [window].concat('foo.bar.baz'.split('.')).reduce(function(prev, curr) { return prev[curr]; }); console.log(name); // -> 'true' 

Lo que se me ocurre es usar la división de cadenas para dividir primero esa cadena en una matriz y acceder al objeto a través de [] para acceder al atributo de ese objeto con un bucle

Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.