初学者对有关嵌套对象函数的 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
引用。
我 运行 在这个较旧的论坛中遇到了一个奇怪的问题,没有解释它为什么有效 (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
引用。