Dynamically create javascript objects with variable depth

I have problems with a nasty JSON object that I need to convert to a variable depth JS object.

Soon: (I am using 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}. 

Now I need to convert this nastyJSON to a variable depth JS object. I mean:

 var reusableJSObject = { generics : { utenteID : 1, elencoID : 1 }, mainbar : { ade : { stepID : { 0 : 1, 1 : 3 }, stepTitle : { 0 : "blablabla", 1 : "quiquoqua" } } } } 

My best bet is to create it manually, loop nastyJSON, the keys of the switch cover and create objects that add values ​​at the end of a well-known depth.

Like this:

 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! } }); 

But, if at first I do not know the structure of nastyJSON, and I only know that nastyJSON has keys that I needed to separate and enclose until the end of the split?

Thanks in advance.

+5
source share
1 answer

You don't need jQuery, vanilla JS will do ( here is the 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))); 

Conclusion:

 { "generics":{ "utenteID":"1", "elencoID":"1" }, "mainbar":{ "ade":{ "stepID":{ "0":"1", "1":"3" }, "stepTitle":{ "0":"blablabla", "1":"quiquoqua" } } } } 
+3
source

All Articles