动态创建 JavaScript 个具有可变深度的对象
Dynamically create JavaScript objects with variable depth
我遇到了一个麻烦的 JSON 对象,我需要将其转换为具有可变深度的 JS 对象。
很快:(我正在使用 jQuery)
var nastyJSON_string = "{"generics_utenteID":"1","generics_elencoID":"1","mainbar_ade_stepID_0":"1","mainbar_ade_stepID_1":"3","mainbar_ade_stepTitle_0":"blablabla", "mainbar_ade_stepTitle_1" : "quiquoqua"}";
var nastyJSON = JSON.parse(nastyJSON_string);
// nastyJSON if parsed correctly now is: {generics_utenteID:"1",generics_elencoID:"1" ...and so on}.
现在,我需要将那个讨厌的JSON 转换为具有可变深度的 JS 对象。我的意思是:
var reusableJSObject = {
generics : {
utenteID : 1,
elencoID : 1
},
mainbar : {
ade : {
stepID : {
0 : 1,
1 : 3
},
stepTitle : {
0 : "blablabla",
1 : "quiquoqua"
}
}
}
}
我最好的办法是手动创建它,循环讨厌的JSON,切换套管键并创建对象在众所周知的深度末尾添加值。
像这样:
jQuery.each(nastyJSON, function(key,value){
var keysp = key.split('_');
switch(keysp[0])
{
//# generics
case 'generics':
if(!reusableJSObject.hasOwnProperty(keysp[0])) { reusableJSObject[keysp[0]] = new Object(); };
switch(keysp[1])
{
//# utenteID
case 'utenteID':
if(!reusableJSObject[keysp[0]].hasOwnProperty(keysp[1])) { reusableJSObject[keysp[0]][keysp[1]]; };
reusableJSObject[keysp[0]][keysp[1]] = Number(value);
break;
//# elencoID
case 'elencoID':
if(!reusableJSObject[keysp[0]].hasOwnProperty(keysp[1])) { reusableJSObject[keysp[0]][keysp[1]]; };
reusableJSObject[keysp[0]][keysp[1]] = Number(value);
break;
}
break;
//# mainbar
case 'mainbar':
if(!reusableJSObject.hasOwnProperty(keysp[0])) { reusableJSObject[keysp[0]] = new Object(); };
break;
//... and So On!
}
});
但是,如果我一开始不知道 nastyJSON 结构,而我只知道 nastyJSON 有键,我必须拆分和嵌套直到拆分结束怎么办?
提前致谢。
你不需要 jQuery,vanilla JS 就可以了(here 是 fiddle):
var json = '{"generics_utenteID":"1","generics_elencoID":"1","mainbar_ade_stepID_0":"1","mainbar_ade_stepID_1":"3","mainbar_ade_stepTitle_0":"blablabla", "mainbar_ade_stepTitle_1" : "quiquoqua"}';
var obj = JSON.parse(json);
function parse(object) {
var result = {};
var temp = {};
var keys;
for (var property in object) {
keys = property.split('_');
temp = result;
for (var i = 0; i < keys.length - 1; i++) {
if (typeof temp[keys[i]] == 'undefined') {
temp[keys[i]] = {};
}
temp = temp[keys[i]];
};
temp[keys[i]] = object[property];
}
return result;
}
console.log(JSON.stringify(parse(obj)));
输出:
{
"generics":{
"utenteID":"1",
"elencoID":"1"
},
"mainbar":{
"ade":{
"stepID":{
"0":"1",
"1":"3"
},
"stepTitle":{
"0":"blablabla",
"1":"quiquoqua"
}
}
}
}
我遇到了一个麻烦的 JSON 对象,我需要将其转换为具有可变深度的 JS 对象。
很快:(我正在使用 jQuery)
var nastyJSON_string = "{"generics_utenteID":"1","generics_elencoID":"1","mainbar_ade_stepID_0":"1","mainbar_ade_stepID_1":"3","mainbar_ade_stepTitle_0":"blablabla", "mainbar_ade_stepTitle_1" : "quiquoqua"}";
var nastyJSON = JSON.parse(nastyJSON_string);
// nastyJSON if parsed correctly now is: {generics_utenteID:"1",generics_elencoID:"1" ...and so on}.
现在,我需要将那个讨厌的JSON 转换为具有可变深度的 JS 对象。我的意思是:
var reusableJSObject = {
generics : {
utenteID : 1,
elencoID : 1
},
mainbar : {
ade : {
stepID : {
0 : 1,
1 : 3
},
stepTitle : {
0 : "blablabla",
1 : "quiquoqua"
}
}
}
}
我最好的办法是手动创建它,循环讨厌的JSON,切换套管键并创建对象在众所周知的深度末尾添加值。
像这样:
jQuery.each(nastyJSON, function(key,value){
var keysp = key.split('_');
switch(keysp[0])
{
//# generics
case 'generics':
if(!reusableJSObject.hasOwnProperty(keysp[0])) { reusableJSObject[keysp[0]] = new Object(); };
switch(keysp[1])
{
//# utenteID
case 'utenteID':
if(!reusableJSObject[keysp[0]].hasOwnProperty(keysp[1])) { reusableJSObject[keysp[0]][keysp[1]]; };
reusableJSObject[keysp[0]][keysp[1]] = Number(value);
break;
//# elencoID
case 'elencoID':
if(!reusableJSObject[keysp[0]].hasOwnProperty(keysp[1])) { reusableJSObject[keysp[0]][keysp[1]]; };
reusableJSObject[keysp[0]][keysp[1]] = Number(value);
break;
}
break;
//# mainbar
case 'mainbar':
if(!reusableJSObject.hasOwnProperty(keysp[0])) { reusableJSObject[keysp[0]] = new Object(); };
break;
//... and So On!
}
});
但是,如果我一开始不知道 nastyJSON 结构,而我只知道 nastyJSON 有键,我必须拆分和嵌套直到拆分结束怎么办?
提前致谢。
你不需要 jQuery,vanilla JS 就可以了(here 是 fiddle):
var json = '{"generics_utenteID":"1","generics_elencoID":"1","mainbar_ade_stepID_0":"1","mainbar_ade_stepID_1":"3","mainbar_ade_stepTitle_0":"blablabla", "mainbar_ade_stepTitle_1" : "quiquoqua"}';
var obj = JSON.parse(json);
function parse(object) {
var result = {};
var temp = {};
var keys;
for (var property in object) {
keys = property.split('_');
temp = result;
for (var i = 0; i < keys.length - 1; i++) {
if (typeof temp[keys[i]] == 'undefined') {
temp[keys[i]] = {};
}
temp = temp[keys[i]];
};
temp[keys[i]] = object[property];
}
return result;
}
console.log(JSON.stringify(parse(obj)));
输出:
{
"generics":{
"utenteID":"1",
"elencoID":"1"
},
"mainbar":{
"ade":{
"stepID":{
"0":"1",
"1":"3"
},
"stepTitle":{
"0":"blablabla",
"1":"quiquoqua"
}
}
}
}