Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

144
Vistas
¿Es posible indexar en un objeto utilizando claves de cadena de una matriz dinámica en JavaScript?

¿Es posible establecer claves dinámicamente cuando se usa esta sintaxis como se muestra en este ejemplo?

En este ejemplo, la función changeValue cambia el objeto de estado que se muestra en la parte superior. La función changeValue toma una matriz de claves de cadena para usar como una forma de establecer dinámicamente el valor.

Este código no funciona y no estoy buscando enfoques alternativos: (dentro de una alternancia razonable)

 const state = { profile: { isFollowing: false, }, person: { characteristics: { gender: "male" } } } console.log(state.profile.isFollowing) //false console.log(state.person.characteristics.gender) //male function changeValue(keys, value){ state[keys] = value } console.log(state.profile.isFollowing) //true console.log(state.person.characteristics.gender) //female changeValue(["profile", "isFollowing"], true) //<-- using an array of strings //AFTER STATE CHANGE //const state = { // profile: { // isFollowing: true, // }, // person: { // characteristics: { // gender: "male" // } // } //} changeValue(["person", "characteristics", "gender"], "female") //<-- using an array of strings //AFTER STATE CHANGE //const state = { // profile: { // isFollowing: true, // }, // person: { // characteristics: { // gender: "female" // } // } //}

No quiero tener que definir manualmente las [keys] dentro de la función changeValue .

es posible?

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Cosa segura. Una función auxiliar como esta debería funcionar.

 const state = { profile: { isFollowing: false, }, person: { characteristics: { gender: "male" } } } function changeValue(target, path, value) { for(let i = 0; i < path.length - 1; i++) { target = target[path[i]]; } target[path[path.length - 1]] = value; } console.log(JSON.stringify(state)); changeValue(state, ["profile", "isFollowing"], true); console.log(JSON.stringify(state)); changeValue(state, ["person", "characteristics", "gender"], "female"); console.log(JSON.stringify(state));

about 4 years ago · Juan Pablo Isaza Denunciar

0

No, no puede simplemente indexar un objeto con una matriz y hacer que descienda automáticamente jerárquicamente. Hay módulos que puede instalar que le permiten hacer cosas similares; por ejemplo, consulte el método set de lodash . Tienes que unir la matriz en un solo archivo . cadena de ruta de clave separada, pero es básicamente lo que está buscando.

Sin embargo, también es bastante fácil hacerlo usted mismo en Vanilla JS con un bucle:

 function changeValue(keyPath, newValue) { let target = state let key = keyPath[0] for (let i=1; i<keyPath.length; ++i) { target = target[key] key = keyPath[i] } target[key] = newValue; }

Aquí está en acción:

 const state = { profile: { isFollowing: false, }, person: { characteristics: { gender: "male" } } } function changeValue(keyPath, newValue) { let target = state let key = keyPath[0] for (let i=1; i<keyPath.length; ++i) { target = target[key] key = keyPath[i] } target[key] = newValue; } changeValue(["profile", "isFollowing"], true); changeValue(["person", "characteristics", "gender"], "female") console.log(state);

about 4 years ago · Juan Pablo Isaza Denunciar

0

Otro método podría ser usar reduce para trabajar el objeto hasta llegar al último elemento y luego establecer su valor.

 const state = { profile: { isFollowing: false, }, person: { characteristics: { gender: "male" } } } function changeValue(keys, value){ keys.slice(0,-1).reduce((acc, k) => acc[k], state)[keys.slice(-1)] = value } changeValue(["profile", "isFollowing"], true); console.log(state); changeValue(["person", "characteristics", "gender"], "female"); console.log(state);

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda