初学者对有关嵌套对象函数的 JavaScript 语法的困惑

Beginner confusion on JavaScript syntax regarding nested object function

我 运行 在这个较旧的论坛中遇到了一个奇怪的问题,没有解释它为什么有效 (https://hashnode.com/post/how-to-create-nested-child-objects-in-javascript-from-array-cj9tsc3we01m0uowu4pyuesy0),虽然我能够理解那里的一些其他解决方案问题分解为多个函数,其中一个引起了我的注意,这让我对某些 JavaScript 概念的理解非常困惑。这是问题的答案:

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)); 

以此为预期输出:

{1: {2: {3: { }}}} 

到目前为止我理解了for循环结构中的一切,但实际的代码块似乎少了一行代码。 节点在什么时候被插入到新的空对象中? 我最好的猜测是 'node' 变量在每次迭代的开始和结束时都有不同的值。但是当我控制台记录节点时,它只给我一个空列表: {}

在循环中记录节点会给你一个空对象,因为你总是在循环中为它分配一个空对象。如果您想解决问题,请改为记录 list,因为这是 top-level 对象,其中分配了所有其他内容。

这个:

node = node[insertArray[i]] = {};

做三件事:创建一个对象,将该对象分配给 node[insertArray[i]],并将 node 变量重新分配给该新对象。一种不那么令人困惑的写作方式是:

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));

现在流程应该很清楚了。在每次迭代中,都会创建一个新的空对象,该对象被分配给整个结构中嵌套最深的对象 far,然后 node 被分配给那个新的空对象(成为新的嵌套最深的对象)。

At what point does the node get inserted into the new empty object?

变量 node 不会被插入到任何“新的空对象”中,它是 other 的方式。

在代码的第 4 行,在 for 循环中,您声明 node 并将其指定为对 pre-existing list 对象的引用。

因此,第一个更新为 node,例如node = node[insertArray[i]] = {}; 添加一个 属性 “1”到“父”list 对象。

for 循环的后续迭代然后使用新的空对象更新最近嵌套的 属性,由 node 引用。