2015-05-05 2 views
5

У меня проблема с неприятным объектом JSON, который мне нужно преобразовать в объект JS с переменной глубиной.Динамически создавать объекты JavaScript с переменной глубиной

Коротко: (я использую 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}. 

Теперь мне нужно преобразовать, что nastyJSON в объект JS с переменной глубиной. Я имею в виду:

var reusableJSObject = { 
    generics : { 
     utenteID : 1, 
     elencoID : 1 
    }, 

    mainbar : { 
     ade : { 
      stepID : { 
       0 : 1, 
       1 : 3 
      }, 

      stepTitle : { 
       0 : "blablabla", 
       1 : "quiquoqua" 
      } 
     } 
    } 
} 

Мои лучше всего создать его вручную, зацикливание ключей nastyJSON, переключает-обсадные и создание объектов добавляющих ценности в конце известной глубины.

Как это:

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 не имеет ключи, я должен был разделить и гнездо до конца раскола?

Заранее спасибо.

+0

Я не могу изменить тип строки, который должен быть обработан (nastyJSON_string). Я должен работать с ключами с «_» в них, чтобы указать изменение уровня в конечном js-объекте. – Nineoclick

ответ

3

Вам не нужно JQuery, ваниль JS будет делать (here является скрипка):

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" 
     } 
     } 
    } 
} 
Смежные вопросы