代码之家  ›  专栏  ›  技术社区  ›  SOS

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

  •  0
  • SOS  · 技术社区  · 4 年前

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

    2 回复  |  直到 4 年前
        1
  •  0
  •   CertainPerformance    4 年前

    将节点记录到循环中会给您一个空对象,因为您总是在循环中为其分配一个空对象。如果你想把事情弄清楚,把 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));

    现在这个过程应该很清楚了。在每次迭代中,都会创建一个新的空对象,该对象被指定给嵌套最深的对象 目前为止 在整体结构中,然后 节点 被指定给新的空对象(成为嵌套最深的新对象)。

        2
  •  0
  •   John Jordan    4 年前

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

    变量 node 不会被插入任何“新的空对象”,它是 另外 到处都是。

    在代码的第4行,在 for 循环,你声明 节点 并将其指定为对先前存在的 list 对象

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

    的后续迭代 对于 循环,然后更新最近嵌套的属性,该属性由 节点 ,带有一个新的空对象。