Javascript动态嵌套对象
我正在研究如何从字符串创建动态嵌套对象,例如字符串“obj1.obj2.obj3.obj4”,如何将其转换为具有相同顺序的嵌套对象 我在谷歌上搜索了一下,发现了这段漂亮而干净的代码,但我不明白它是如何工作的,在它的编写页面上也没有任何解释,有人能解释一下它是如何工作的吗 代码如下: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
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]] = {};