我正在研究如何从字符串创建动态嵌套对象,例如,字符串" obj1.obj2.obj3.obj4",如何将其转换为具有相同顺序的嵌套对象
我google了一下,我发现这个漂亮而干净的代码,但我不明白它是如何工作的,并且在它所写的页面上没有任何解释,有人可以解释这是如何工作的吗?
这是代码:
var s = "key1.key2.key3.key4";
var a = s.split('.');
var obj = {};
var temp = obj;
for (var k =0; k < a.length; k++) {
temp = temp[a[k]] = {};
console.log(temp);
}
console.log(obj);
&#13;
为什么会有var temp = obj
?
这条线做了什么?:
temp = temp[a[k]] = {};
另外,循环内的console.log(temp)总是记录一个空对象{},为什么?
感谢您的反馈!
答案 0 :(得分:2)
为什么会有
var temp = obj
?
obj
是一个用于保存已完成对象的变量。 temp
是一个变量,用于保存正在构建的对象的每个中间步骤。 temp
以与obj
相同的值开头,以便循环的第一次迭代添加到obj
。
这条线做了什么?:
temp = temp[a[k]] = {};
temp
中名为a[k]
的属性,其中a[k]
是a
中的值之一。temp
。这可以分别写成两行:
temp[a[k]] = {};
temp = temp[a[k]];
另外,循环内的console.log(temp)总是记录一个空对象{},为什么?
因为前一行将空对象分配给temp
。
答案 1 :(得分:1)
您的问题归结为此(评论内联)
var x = {};
var y = x;
y[ "a" ] = {}; //reference to x stays so x also becomes { "a": {} }
y = y["a"]; //now y effectively becomes {} but has the same reference to y["a"] as assignment works right to left hence property `a` is becomes non-enumerable and hence shadowed.
console.log( "First Run" );
console.log( y ); //prints {}
console.log( x ); //prints { "a": {} }
y[ "a" ] = {}; //y still has a non-enumerable property `a`
y = y["a"]; //same as above y = y["a"], y again becomes {}
console.log( "Second Run" );
console.log( y ); //prints {} again
console.log( x ); //prints { "a": { "a": {} } }
&#13;
<强>输出强>
首次运行
{}
{&#34; a&#34;:{}}
第二次运行
{}
{&#34; a&#34;:{ &#34; a&#34;:{}}}
答案 2 :(得分:0)
在代码中添加了评论,希望它有用
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);
答案 3 :(得分:0)
看起来你正在迭代数组,因为临时对象是新创建的并且将键分配给obj。
temp = temp[a[k]] = {};
上面的行只是将[index]值指定为新对象的键,并作为obj的引用创建嵌套对象。
您的问题,
为什么会有var temp = obj?
它将obj对象复制到临时变量
另外,循环内的console.log(temp)总是记录一个空对象{},为什么?
因为您正在重新创建一个空对象(或重新分配)。