我有一个. (点)分隔的字符串,我想从它创建嵌套的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'
}但这不是我想要的。我也在谷歌上搜索过,也发现了类似的问题,但是没有解决我的问题。比如,这。
发布于 2018-03-09 16:50:45
每次都需要创建一个新对象,并将其归因于最后创建的对象。直到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);
发布于 2018-03-09 16:55:31
一个很好的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] = {};发布于 2018-03-09 16:55:45
您可以将最后分割的部分用作某些有效负载的属性。
我建议保留对象引用,并在必要时使用一个临时变量来访问创建一个新属性。
请避免使用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);
https://stackoverflow.com/questions/49198398
复制相似问题