Considera lo siguiente :
let data = { "world": "bc", "d": "ef", "g": "hi", }; let panel = { "hello": { "world": {}, } }; let dataTree = panel.hello; let exampleBool = true; if (exampleBool) { dataTree = panel.hello.world; } Object.assign(dataTree, data); dataTree.world = "xz"; console.log(dataTree.world); console.log(data.world); console.log(data === dataTree);Producción :
xz bc falseSalida deseada :
xz xz true Me gustaría establecer un valor para la propiedad del objeto a la que hace referencia dataTree , que puede cambiar según exampleBool . Me gustaría vincular el objeto al que hacen referencia data para que sea el mismo que dataTree , en otras palabras, hace que dataTree === data sea true .
El problema con Object.assign es que hace una copia de cada propiedad en los data y, en mi caso, las claves data pueden tener una longitud de miles, por lo que no quiero clonar cada una.
¿Alguna forma de hacer esto en JS?
Me gustaría establecer un valor para la propiedad del objeto a la que hace referencia
dataTree
La variable dataTree no es una referencia a una propiedad de objeto. No existe tal cosa en JS. dataTree hace referencia al objeto { "world": {} } (o, después de la asignación condicional, el objeto {} ), y eso es todo. No puede mutar la propiedad de donde obtiene el objeto a través de la variable.
En su lugar, almacene el objeto base y el nombre de la propiedad:
let data = { "world": "bc", "d": "ef", "g": "hi", }; let panel = { "hello": { "world": {}, } }; let dataTreeBase = panel, dataTreeProp = "hello"; let exampleBool = true; if (exampleBool) { dataTreeBase = panel.hello; dataTreeProp = "world"; } dataTreeBase[dataTreeProp] = data; dataTreeBase[dataTreeProp].world = "xz"; console.log(dataTreeBase[dataTreeProp].world); console.log(data.world); console.log(data === dataTreeBase[dataTreeProp]);Por supuesto, hay varias formas de abstraer esto en funciones u objetos con getters/setters o métodos, pero no puede lograr esto con solo una variable simple.
Puede asignar dataTree a data :
let data = { "world": "bc", "d": "ef", "g": "hi", }; let panel = { "hello": { "world": {}, } }; let dataTree = panel.hello; let exampleBool = true; if (exampleBool) { dataTree = panel.hello.world; } data = dataTree; dataTree.world = "xz"; console.log(dataTree.world); console.log(data.world); console.log(data === dataTree);