Javascript动态嵌套对象

时间:2017-11-14 05:48:48

标签: javascript

我正在研究如何从字符串创建动态嵌套对象,例如,字符串" 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;
&#13;
&#13;

为什么会有var temp = obj

这条线做了什么?:

temp = temp[a[k]] = {};

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

感谢您的反馈!

4 个答案:

答案 0 :(得分:2)

  

为什么会有var temp = obj

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

  

这条线做了什么?:

temp = temp[a[k]] = {};
  1. 将空对象分配给temp中名为a[k]的属性,其中a[k]a中的值之一。
  2. 将新的空对象分配给temp
  3. 这可以分别写成两行:

    temp[a[k]] = {};
    temp = temp[a[k]];
    
      

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

    因为前一行将空对象分配给temp

答案 1 :(得分:1)

您的问题归结为此(评论内联

&#13;
&#13;
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;
&#13;
&#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)总是记录一个空对象{},为什么?

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