Javascript动态嵌套对象

Javascript动态嵌套对象,javascript,Javascript,我正在研究如何从字符串创建动态嵌套对象,例如字符串“obj1.obj2.obj3.obj4”,如何将其转换为具有相同顺序的嵌套对象 我在谷歌上搜索了一下,发现了这段漂亮而干净的代码,但我不明白它是如何工作的,在它的编写页面上也没有任何解释,有人能解释一下它是如何工作的吗 代码如下: var s=“key1.key2.key3.key4”; var a=s.分割('.'); var obj={}; var-temp=obj; 对于(var k=0;k

我正在研究如何从字符串创建动态嵌套对象,例如字符串“obj1.obj2.obj3.obj4”,如何将其转换为具有相同顺序的嵌套对象

我在谷歌上搜索了一下,发现了这段漂亮而干净的代码,但我不明白它是如何工作的,在它的编写页面上也没有任何解释,有人能解释一下它是如何工作的吗

代码如下:

var s=“key1.key2.key3.key4”;
var a=s.分割('.');
var obj={};
var-temp=obj;
对于(var k=0;k控制台日志(obj)在代码中添加了注释,希望有用

var s = "key1.key2.key3.key4";
//split the string by dot(.) and create an array
var a = s.split('.');

//Creating an empty object
var obj = {};
var temp = obj;

//looping over the array
for (var k = 0; k < a.length; k++) {
  //a[k] will be key1,key2,key3....
  // temp is an object,square bracket is use to create a object key
  // using a variable name
  // variable name here is key1,key2....
  //temp[a[k]] will initialize an empty object
  temp = temp[a[k]] = {};
  console.log(temp);
}

console.log(obj);
var s=“key1.key2.key3.key4”;
//按点(.)拆分字符串并创建一个数组
var a=s.分割('.');
//创建空对象
var obj={};
var-temp=obj;
//在阵列上循环
对于(var k=0;k
为什么会有一个
var temp=obj

obj
是保存已完成对象的变量
temp
是一个变量,用于保存正在生成的对象的每个中间步骤
temp
以与
obj
相同的值开始,因此循环的第一次迭代将添加到
obj

这条线是干什么的

  • temp
    中名为
    a[k]
    的属性指定一个空对象,其中
    a[k]
    a
    中的值之一
  • 将新的空对象分配给
    temp
  • 这可以分别写为两行:

    temp[a[k]] = {};
    temp = temp[a[k]];
    
    另外,循环中的console.log(temp)总是记录一个空对象{},为什么


    因为前一行为
    temp
    分配了一个空对象,所以似乎在迭代数组的地方,在该行中,temp对象是新创建的,并将key分配给obj

    temp = temp[a[k]] = {};
    
    上面的一行简单地指定一个[index]值作为新对象的键,并作为对obj的引用创建嵌套对象

    对于你的问题

    为什么存在var temp=obj

    它将obj对象复制到temp变量中

    另外,循环中的console.log(temp)总是记录一个空对象{},为什么


    由于您正在重新创建一个空对象(或重新分配)。

    您的问题归结为(注释内联

    var x={};
    变量y=x;
    y[“a”]={}//对x的引用保持不变,因此x也变为{“a”:{}
    y=y[“a”]//现在y实际上变成了{},但与y[“a”]具有相同的引用,因为赋值从右向左进行,因此属性“a”是不可枚举的,因此被隐藏。
    console.log(“首次运行”);
    控制台日志(y)//打印{}
    控制台日志(x)//打印{“a”:{}
    y[“a”]={}//y仍然具有不可枚举的属性'a`
    y=y[“a”]//与上面的y=y[“a”]相同,y再次变成{}
    console.log(“第二次运行”);
    控制台日志(y)//再次打印{}
    
    控制台日志(x)//打印{“a”:{“a”:{}}
    但是如何使用此代码实现嵌套?我的意思是,这些物体之间的联系是如何发生的?为什么它最终不是一个扁平的独立的4个对象呢?因为
    temp[a[k]]
    包含新(创建)级别的对象,并且在初始化之后
    new-level
    分配给
    temp
    并成为有意义的对象的当前级别,所以在这行
    temp[a[k]={}
    新的obj级别被创建,由于obj引用了temp,它也将拥有该obj,在下一行
    temp=temp[a[k]]
    我们将temp对象级别移动到新创建的级别,因此,当您运行循环的下一次迭代时,它只会将新创建的对象添加到该级别。对吗?您应该学习如何使用JavaScript调试器。不仅仅是
    console.log()
    ,而是真正的调试器,在这里您可以一步一步地检查代码、语句,并在每一步中查看所有变量。这样做可以回答所有关于代码的问题。下面是一个帮助您开始的示例。
    y=y[“a”]//现在y实际上变成了{},但与y[“a”]有着相同的引用,因为赋值从右到左进行,因此属性
    a`is变得不可枚举,因此被隐藏。`你能详细说明一下吗?@therayess不是在变量隐藏方面(也许我没有得到正确的词)。当您在浏览器控制台中运行此代码并尝试展开y的输出
    []
    时,您将看到
    a
    ,因为它刚刚被浏览器评估过。但是,
    y
    实际上只是
    []
    ,您不能执行
    y[“a”]
    事件,但它在内部仍有相同的引用。
    temp = temp[a[k]] = {};