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

Beginner confusion on JavaScript syntax regarding nested object function

提问人:SOS 提问时间:4/14/2022 最后编辑:Heretic MonkeySOS 更新时间:4/14/2022 访问量:31

问:

我在这个较旧的论坛中遇到了一个奇怪的问题,没有解释为什么它能工作(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”变量在每次迭代的开始和结束时都有不同的值。但是当我控制台记录节点时,它只给了我一个空列表:{}

JavaScript 数组嵌 嵌套列表

评论


答:

0赞 CertainPerformance 4/14/2022 #1

在循环中记录节点将为您提供一个空对象,因为您始终在循环中为其分配一个空对象。如果你想弄清楚事情,请记录 相反,因为这是顶级对象,其他所有内容都在其中分配。list

这:

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

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

评论

0赞 SOS 4/14/2022
是的,改写这确实有很大帮助。我意识到我认为节点是迭代中唯一使用的变量,当它最初是用于将列表值分配给节点的“=”运算符,而不是“==”运算符时。还是习惯了C#,哈哈。干杯。
0赞 John Jordan 4/14/2022 #2

节点在什么时候插入到新的空对象中?

变量不会入到任何“新的空对象”中,反之亦然。node

在代码的第 4 行,在循环中,声明并指定它作为对预先存在的对象的引用。fornodelist

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

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