Digamos que tengo un objeto llamado foo y me gustaría realizar la siguiente operación:
foo.bar.baz.qwer.asdf = 5;
El problema es que la bar puede no existir, pero si existe, entonces el baz dentro de ella puede no existir, etc.
Pensé que sería capaz de hacer algo como esto:
foo?.bar?.baz?.qwer?.asdf = 5 , pero, por desgracia, ese tipo de encadenamiento solo parece funcionar con la recuperación de valores, no con el establecimiento de valores.
El comportamiento deseado es que si algo como baz ya existe, entonces se accede a ese objeto (y se mantienen sus miembros existentes), pero si baz no existe, entonces esa propiedad se crea sobre la marcha.
Es decir, digamos que solo existía foo.bar . Luego, después de la operación de asignación anterior, el objeto resultante sería:
foo { bar: { baz: { qwer: { asdf: 5 } } } }Entonces mi pregunta es: ¿se puede hacer esto con construcciones de sintaxis de lenguaje existentes, o se debe crear una función auxiliar? Si es así, ¿tiene este tipo de función un nombre que pueda buscar y hacer referencia?
He escrito esto:
function setProperty(obj, property, value) { const properties = property.split('.'); const lastProperty = properties.pop(); for (let prop of properties) { if (!obj[prop]) { obj[prop] = {}; } obj = obj[prop]; } obj[lastProperty] = value; } const startObj = {'a': {}}; setProperty(startObj, 'abcde', 'e is the best letter'); console.log(startObj); Sin embargo, tendrá comportamientos inesperados si existe una de las propiedades intermedias pero no es un objeto. Por ejemplo, prueba la función anterior con el objeto inicial {a:{b:2}}
Además, tenga en cuenta que el significado de obj cambia a medida que la función procesa. Al principio, se refiere al objeto base, pero luego se refiere a cada objeto anidado durante el ciclo.