提问人:SOS 提问时间:4/14/2022 最后编辑:Heretic MonkeySOS 更新时间:4/14/2022 访问量:31
初学者对有关嵌套对象函数的 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
这:
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
评论
节点在什么时候插入到新的空对象中?
变量不会入到任何“新的空对象”中,反之亦然。node
在代码的第 4 行,在循环中,声明并指定它作为对预先存在的对象的引用。for
node
list
因此,第一次更新为 ,例如 将属性“1”添加到“父”对象。node
node = node[insertArray[i]] = {};
list
然后,循环的后续迭代将使用新的空对象更新由 引用的最新嵌套属性。for
node
评论