我有一个.
(点)分隔的字符串,我想从中创建嵌套的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。
答案 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表示未加字符串的对象。
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;