动态创建嵌套的Javascript对象

时间:2018-03-09 16:45:47

标签: javascript json string

我有一个.(点)分隔的字符串,我想从中创建嵌套的JSON对象。字符串的长度不固定。例如,

var string = 'a.b.c.d';

然后我的JSON对象应该如下:

a: {
    b: {
        c:{
           d: {
                  //Some properties here. 
              }
          } 
    }
}

我尝试过以下代码:

var packageName = "a.b.c.d"
var splitted = packageName.split('.');
var json = {};
for(var i=0;i<splitted.length-1;i++){
    json[splitted[i]] = splitted[i+1];
}

但是这会返回

{
    a: 'b', 
    b: 'c',
    c: 'd'
}

但这不是我想要的。我也在谷歌上搜索并发现了类似的问题,但没有解决方案可以回答我的问题。例如this

3 个答案:

答案 0 :(得分:3)

reduce

的一个很好的用例

packageName = "a.b.c.d";
initProps = {hi: 'there'};

obj = packageName.split('.').reduceRight((o, x) => ({[x]: o}), initProps);

console.log(JSON.stringify(obj))

如果你发现循环更容易使用,可以简洁地写一个循环

result = {};
ptr = result;

for (let prop of packageName.split('.'))
    ptr = ptr[prop] = {};

答案 1 :(得分:1)

您需要每次创建一个新对象并将其归因于最后创建的对象。它会持续到splitted.length,而不是splitted.length - 1,因为您使用的是<,而不是<=

var packageName = "a.b.c.d";
var splitted = packageName.split('.');
var json = {};
var current = json;
for (var i = 0; i < splitted.length; i++) {
    current[splitted[i]] = {};
    current = current[splitted[i]];
}
console.log(json);

答案 2 :(得分:0)

您可以将最后一个拆分部分用作某个有效负载的属性。

我建议保留对象引用,并在必要时使用临时变量来创建新属性。

请避免使用JSON表示未加字符串的对象。

&#13;
&#13;
var packageName = "a.b.c.d",
    splitted = packageName.split('.'),
    result = {},
    temp = result,
    i;
  
for (i = 0; i < splitted.length - 1; i++) {
   temp[splitted[i]] = temp[splitted[i]] || {};
   temp = temp[splitted[i]];
}

temp[splitted[i]] = { some: 'data' };

console.log(result);
&#13;
&#13;
&#13;