Estoy tratando de acceder a una propiedad de un objeto usando un nombre dinámico. es posible?
const something = { bar: "Foobar!" };
const foo = 'bar';
something.foo; // The idea is to access something.bar, getting "Foobar!"
javascript
object
properties
RichW
fuente
fuente
Respuestas:
Hay dos formas de acceder a las propiedades de un objeto:
something.bar
something['bar']
El valor entre paréntesis puede ser cualquier expresión. Por lo tanto, si el nombre de la propiedad se almacena en una variable, debe usar la notación de paréntesis:
fuente
Esta es mi solución:
Ejemplos de uso:
fuente
En javascript podemos acceder con:
foo.bar
foo[someVar]
ofoo["string"]
Pero solo el segundo caso permite acceder a las propiedades dinámicamente:
fuente
El siguiente es un ejemplo de ES6 de cómo puede acceder a la propiedad de un objeto utilizando un nombre de propiedad que se ha generado dinámicamente mediante la concatenación de dos cadenas.
Esto se llama nombres de propiedades calculadas
fuente
Puede lograr esto de muchas maneras diferentes.
La notación de corchetes es especialmente poderosa ya que le permite acceder a una propiedad basada en una variable:
Esto se puede extender al bucle sobre cada propiedad de un objeto. Esto puede parecer redundante debido a las nuevas construcciones de JavaScript, como para ... de ..., pero ayuda a ilustrar un caso de uso:
La notación de punto y paréntesis también funciona como se espera para los objetos anidados:
Desestructuración de objetos
También podríamos considerar la desestructuración de objetos como un medio para acceder a una propiedad en un objeto, pero de la siguiente manera:
fuente
Puedes hacerlo así usando Lodash get
fuente
ACTUALIZADO
He tenido en cuenta los comentarios a continuación y acepto. Eval debe ser evitado.
Acceder a las propiedades raíz en el objeto se logra fácilmente con
obj[variable]
, pero anidarse complica las cosas. No escribir código ya escrito que sugiero usarlodash.get
.Ejemplo
Lodash get se puede usar de diferentes maneras, aquí hay un enlace a la documentación lodash.get
fuente
eval
siempre que sea posible. stackoverflow.com/questions/86513/…eval
para algo tan trivial como acceder a las propiedades es simplemente excesivo y difícilmente aconsejable bajo ninguna circunstancia. ¿Qué es "problema"?obj['nested']['test']
funciona muy bien y no requiere que incruste código en cadenas.obj['nested']['value']
- recuerda niños, eval es malvado!_.get
a la mesa. Creo que esta respuesta merece ahora votos positivos en lugar de votos negativos. Puede ser excesivo, pero es bueno saber que existe.Siempre que necesite acceder a la propiedad dinámicamente, debe usar corchetes para acceder a la propiedad no ". operador
Sintaxis: objeto [propiedad}
fuente
Encontré un caso en el que pensé que quería pasar la "dirección" de una propiedad de objeto como datos a otra función y llenar el objeto (con AJAX), buscar desde la matriz de direcciones y mostrar esa otra función. No podía usar la notación de puntos sin hacer acrobacias de cadena, así que pensé que sería bueno pasar una matriz. Terminé haciendo algo diferente de todos modos, pero parecía relacionado con esta publicación.
Aquí hay una muestra de un objeto de archivo de idioma como el que quería datos:
Quería poder pasar una matriz como: ["audioPlayer", "controles", "detener"] para acceder al texto del idioma, "detener" en este caso.
Creé esta pequeña función que busca el parámetro de dirección "menos específico" (primero) y reasigna el objeto devuelto a sí mismo. Entonces está listo para buscar el siguiente parámetro de dirección más específico si existe.
uso:
fuente
Se pone interesante cuando tienes que pasar parámetros a esta función también.
Código jsfiddle
fuente
ES5 // Comprobar variables profundamente anidadas
Este simple código puede verificar la existencia de variables / valores profundamente anidados sin tener que verificar cada variable en el camino ...
Ex. - una matriz de objetos profundamente anidada:
En lugar de :
Ahora podemos:
¡Salud!
fuente
Function
en su lugarHice una pregunta que se duplicó un poco sobre este tema hace un tiempo, y después de una investigación excesiva, y viendo que falta mucha información que debería estar aquí, siento que tengo algo valioso que agregar a esta publicación anterior.
sin embargo, rara vez tomo esta ruta porque no funciona en valores de propiedad asignados a través de hojas de estilo. Para darle un ejemplo, lo demostraré con un poco de pseudocódigo.
Usando el ejemplo de código anterior; si la propiedad de ancho del elemento div que se almacenó en la variable 'elem' se diseñó en una hoja de estilo CSS, y no se diseñó dentro de su etiqueta HTML, sin duda obtendrá un valor de retorno de indefinido almacenado en el interior de la variable cssProp. El valor indefinido ocurre porque para obtener el valor correcto, el código escrito dentro de una hoja de estilo CSS debe calcularse para obtener el valor, por lo tanto; debe usar un método que calcule el valor de la propiedad cuyo valor se encuentra dentro de la hoja de estilo.
W3Schools getComputedValue Doc Esto proporciona un buen ejemplo y le permite jugar con él, sin embargo, este enlace Mozilla CSS getComputedValue doc habla sobre la función getComputedValue en detalle, y debe ser leído por cualquier desarrollador aspirante que no esté totalmente claro sobre este tema.
... consigue y establece. Es lo que uso, el único inconveniente es que debes conocer JQuery, pero esta es honestamente una de las muchas buenas razones por las que todo desarrollador de Javascript debería aprender JQuery, simplemente hace la vida más fácil y ofrece métodos, como este, que no está disponible con Javascript estándar. ¡¡¡Espero que esto ayude a alguien!!!
fuente
Para cualquiera que busque establecer el valor de una variable anidada, aquí se explica cómo hacerlo:
Documentación: https://lodash.com/docs/4.17.15#set
Además, documentación si desea obtener un valor: https://lodash.com/docs/4.17.15#get
fuente
Debe usar
JSON.parse
, eche un vistazo a https://www.w3schools.com/js/js_json_parse.aspfuente
fuente
foo
ya es una cadena, por lo que`${foo}`
es exactamente lo mismo quefoo
. (Además, el código parece tener algunas barras invertidas adicionales que no pertenecen allí Pero aún sería inútil incluso si se fija que error de sintaxis..)