Me encontré con un problema extraño en este foro anterior sin explicación de por qué funciona ( https://hashnode.com/post/how-to-create-nested-child-objects-in-javascript-from-array-cj9tsc3we01m0uowu4pyuesy0 ) , y aunque pude entender algunas de las otras soluciones que dividen el problema en varias funciones, me llamó la atención una que confundió mucho mi comprensión de algunos conceptos de JavaScript. Aquí está la respuesta dada en cuestión:
let newArray = [1, 2, 3]; //any array to turn into set of nested objects function arrayToList(insertArray) { let list = {}; for (node = list, i = 0, iterateFor = insertArray.length; i < iterateFor; i++) { node = node[insertArray[i]] = {}; } return list; } console.log(arrayToList(newArray));Con esto como el resultado esperado:
{1: {2: {3: { }}}} Hasta ahora entiendo todo en la estructura del bucle for, pero parece que le falta una línea de código al bloque de código real. ¿En qué punto se inserta el nodo en el nuevo objeto vacío? Mi mejor suposición de por qué esto funciona fue que la variable 'nodo' tenía un valor diferente al principio y al final de cada iteración. Pero cuando registro el nodo en la consola, solo me da una lista vacía: {}
Registrar el nodo dentro del ciclo le dará un objeto vacío porque siempre le está asignando un objeto vacío en el ciclo. Si está tratando de resolver las cosas, registre la list en su lugar, porque ese es el objeto de nivel superior dentro del cual se asigna todo lo demás.
Este:
node = node[insertArray[i]] = {}; hace tres cosas: crea un objeto, asigna ese objeto a node[insertArray[i]] y reasigna la variable de node a ese nuevo objeto. Una forma menos confusa de escribirlo sería:
let newArray = [1, 2, 3]; //any array to turn into set of nested objects function arrayToList(insertArray) { let list = {}; for (node = list, i = 0, iterateFor = insertArray.length; i < iterateFor; i++) { const newNode = {}; node[insertArray[i]] = newNode; node = newNode; } return list; } console.log(arrayToList(newArray)); Ahora el proceso debería ser bastante claro. En cada iteración, se crea un nuevo objeto vacío, ese objeto se asigna al objeto anidado más profundo hasta ahora en la estructura general y luego el node se asigna a ese nuevo objeto vacío (convirtiéndose en el nuevo objeto anidado más profundo).
¿En qué punto se inserta el nodo en el nuevo objeto vacío?
El node variable no se inserta en ningún "nuevo objeto vacío", es al revés .
En la línea 4 de su código, en el bucle for , declara node y lo asigna como referencia al objeto de list preexistente.
Por lo tanto, las primeras actualizaciones a node , por ejemplo, node = node[insertArray[i]] = {}; agrega una propiedad "1" al objeto de list "principal".
Las iteraciones posteriores del bucle for actualizan la propiedad anidada más reciente, a la que hace referencia el node , con un nuevo objeto vacío.