javascript - 动态创建具有可变深度的 JavaScript 对象

标签 javascript jquery json javascript-objects

我遇到了一个讨厌的 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"
            }
        }
    }
}

我最好的办法是手动创建它,循环 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 有键,我必须拆分和嵌套直到拆分结束?

提前致谢。

最佳答案

你不需要 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"
         }
      }
   }
}

关于javascript - 动态创建具有可变深度的 JavaScript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30048842/

相关文章:

jQuery 动画因左/右自动边距而失败

jquery - 如何防止 div 上的默认折叠行为

jquery - jQuery\Grails表单提交在IE中不起作用

javascript - 我正在尝试从 ejs 模板中的 json 文件读取

java - Spring Boot GET 请求 API

JavaScript 不适用于 android WebView,Uncaught ReferenceError

javascript - 在输入类型 'enter' 上按 ="text",怎么样?

javascript - 你的 JavaScript 工具链中有什么?

java - 使用gson解析空Json数组

javascript - jQuery DataTables 插件 - 如何访问底层数据