我有以下JSON对象。我需要将其在javascript中转换为一个一级关联数组。 (键值对)我已经编写了一个递归函数,但似乎无法使其按我希望的方式工作。

{
    "Title" : "Test Match",
    "Players" : [
        {
            "ID" : 1,
            "Name" : "Igi Manaloto",
            "Results" : [2,2,0],
            "TeamMates" : [
                {
                    "ID" : 2,
                    "Name" : "John Ibarra",
                    "Age" : 24,
                    "LikesToWin" : false
                }
            ]
        }, {
            "ID" : 22,
            "Name" : "Shawn Kato",
            "Results" : [2,1,0],
            "TeamMates" : [
                {
                    "Name" : "Gerald Anderson",
                    "Age" : 24,
                    "LikesToWin" : false
                }
            ]
        }
    ],
    "Referees" : [
        {
            "ID" : 10,
            "Name" : "Janice Tieu",
            "YearsAsReferee" : 10,
            "EmploymentHistory" : [
                {
                    "JobTitle" : "Senior Referee",
                    "YearsOnTheJob" : 20,
                    "FavouriteMatchesRefereeed" : [
                        {
                            "Title" : "Duran vs Leonard 1",
                            "Year" : 1992,
                            "Description" : "I was refereeing the test match but I put on make up so Duran lost the bout."
                        }, {
                            "Title" : "Duran vs Leonard 2",
                            "Year" : 1994,
                            "Description" : "I was refereeing the second match but I put on make up so Duran lost another bout."
                        }
                    ]
                }, {
                    "JobTitle" : "Juniour Refereee",
                    "YearsOnTheJob" : 3,
                    "FavouriteMatchesRefereeed" : [
                        {
                            "Title" : "Mexican Figher Jones vs Anna Himley",
                            "Year" : 1972,
                            "Description" : "I coached this match. Hehe."
                        }, {
                            "Title" : "Jennifer from the block 2",
                            "Year" : 1982,
                            "Description" : "I coached this other match. Hehe."
                        }
                    ]
                }
            ]
        }
    ]
}


下面的预期关联数组的示例:

[
    "Title" => "Test Match",
    "Players[0][ID]" => 0,
    "Players[0][Name]" => "Igi Manaloto",
    // rest of the array...
    "Players[0][Teammates][0][ID]" => 2,
    "Players[0][Teammates][0][Name]" => "John Ibarra",
    // rest of the array...
    "Referees[0][EmploymentHistory][FavouriteMatchesRefereeed][Title]" => "Duran vs Leonard 1"
]


这是我到目前为止所做的(javascript)

function converJSONToStrings(values, prevParent){
    console.log(values);
    var result = [];

    for (var key in values)
    {
        var value = values[key];
        if(value.constructor === Array) {
            // console.log("Found object array in key", key );
            for(var x = 0; x<value.length; x++){
                result[key + '[' + x + ']'] = converJSONToStrings(value[x]);
            }
        } else if (typeof value == 'object') {
            for(var x in value){
                result[key + '[' + x + ']'] = converJSONToStrings(value[x]);
            }
        } else {
            result[key] = value;
        }
    }

    return result;
}

最佳答案

终于想出了解决方案!下面的代码...

 /**
  * Formats the JSON result to an associative array, concatenating child and parent keys
  */
 var convertJSONAssoc = function(obj, firstlevel) {
     // consider string, number and boolean values in JSON as the last
     // elements and can't be recursed into any further
     if (typeof obj == 'string' || typeof obj == 'number' || typeof obj == 'boolean') {
         var ab = [];
         var bc = {};
         bc.key = '';
         bc.val = obj;
         ab.push(bc);
         return ab;
     }

     // the top most call which builds the final result
     if (firstlevel) {
         var result = {};
         for (key in obj) {
             var val = obj[key];
             var s = convertJSONAssoc(val, false);
             for (var o = 0; o < s.length; o++) {
                 var v = s[o];
                 result[key + v['key']] = v['val'];
             }
         }
         return result;
     } else {
         // this is where the recursion happens. As long as objects are found,
         // we use the code below to keep on parsing obj keys
         var paths = [];
         for (var key in obj) {
             var val = obj[key];
             var s = convertJSONAssoc(val, false);
             for (var o = 0; o < s.length; o++) {
                 var v = s[o];
                 var de = {};
                 de.key = "[" + key + "]" + v['key'];
                 de.val = v['val'];
                 paths.push(de);
             }
         }
         return paths;
     }
 }

关于javascript - 从嵌套的JSON构建键值数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30299777/

10-09 22:28
查看更多