Tengo la siguiente cadena:
const str = "prop1.prop2.prop3"Quiero usar esta cadena para acceder a la propiedad prop3 del siguiente objeto:
const obj = { prop1: { prop2:{ prop3:{ // ---- destination point } } } } Pero no soy capaz de averiguar cómo hacerlo? debe haber algo que siga agregando obj[currentProp] y así sucesivamente. y... ¿no hay un método más rápido? Me temo que estoy perdiendo el tiempo en algo que se puede lograr más fácilmente.
Este sería mi enfoque:
const access = (path, object) => { return path.split('.').reduce((o, i) => o[i], object) } const obj = { prop1: { prop2: { prop3: { value: 'foo' } } } } const str = 'prop1.prop2.prop3' console.log(access(str, obj)) // {"value": "foo"} usando una función accessDeepProp con dos argumentos, el objeto y la ruta de la propiedad anidada.
function accessDeepProp(obj, path) { if (!path) return obj; const properties = path.split("."); return accessDeepProp(obj[properties.shift()], properties.join(".")); } function accessDeepProp(obj, path) { const properties = path.split("."); for (let i = 0; i < properties.length; i++) { if (!obj) return null; obj = obj[properties[i]]; } return obj; } function accessDeepProp(objName, path) { try { return eval(`${objName}.${path}`); } catch (e) { return null; } }también podría usar el método de obtención de lodash
Puede combinar split con forEach de la siguiente manera:
const str = "prop1.prop2.prop3" const obj = { prop1: { prop2:{ prop3:{ a: "b", c: "d" } } } } var srch = obj; str.split(".").forEach(item => (srch = srch[item])); console.log(srch); // { a: "b", c: "d"} console.log(obj); split convierte el valor de str en una matriz, que luego se repite y en cada iteración, srch obtiene un nivel más profundo.