如何在JSON结果中展平关联对

How to flatten association pairs in JSON result?

本文关键字:关联 结果 JSON      更新时间:2023-09-26

我从服务器收到一个数组,其中包含对象和关联表。例如,我有来自服务器的JSON结果:

var myEvent = {
   "Event":{
      "SessionTags":[
         {
            "SessionID":1,
            "TagID":x
         },
         {
            "SessionID":2,
            "TagID":x
         },
         {
            "SessionID":2,
            "TagID":y
         },
         {
            "SessionID":3,
            "TagID":z
         }
      ],
      "Sessions":[
         {
            "ID":1,
            "Name":"Advanced Tips",
         },
         {
            "ID":2,
            "Name":"Best Practices"
         },
         {
            "ID":3,
            "Name":"Code Fun"
         },
      "Tags":[
         {
            "ID":x,
            "Name":"AJAX"
         },
         {
            "ID":y,
            "Name":"Android"
         },
         {
            "ID":z,
            "Name":"ASP.NET"
         },
      ]
   }
}

请注意用作关联表的"SessionTags"对象。我如何在会话标记中添加正确的标记对象,从而得到以下结果:

var myNewEvent = {
   "Event":{
      "Sessions":[
         {
            "ID":1,
            "Name":"Advanced Tips",
            "Tags":[
              {
               "ID":x,
               "Name":"AJAX"
              }
            ]
         },
         {
            "ID":2,
            "Name":"Best Practices",
            "Tags":[
              {
               "ID":x,
               "Name":"AJAX"
              },
              {
               "ID":y,
               "Name":"Android"
              }
            ]
         },
         {
            "ID":3,
            "Name":"Code Fun",
            "Tags":[
              {
               "ID":z,
               "Name":"ASP.NET"
              }
            ]
         }
   }
}

试试这个:

var getTagName = function(tagId){
    var t = myEvent["Event"]["Tags"];
    for (var i in t); {
        if (t[i].ID == tagId) {
            return t[i].Name;
        }
    }
};
var getTags = function(sessionId){
    var s = myEvent["Event"]["SessionTags"];
    var tags = [];
    for (var i in s) {
        if (s[i]["SessionID"] == sessionId) {
            var tagName = getTagName(s[i]["TagID"]);
            tags.push({"ID": sessionId, "Name": tagName});
        }
    }
    return tags;
};
var addSessionTags = function(){
    var s = myEvent["Event"]["Sessions"];
    for (var i in s) {
        var currentSession = s[i];
        currentSession.Tags = getTags(currentSession.ID);
    }
};
addSessionTags();
delete myEvent.Event.Tags;
delete myEvent.Event.SessionTags;

我不得不稍微清理一下你的数据(x、y、z的ID没有引用任何变量,你还有一些额外的逗号和一个缺失的右括号),以使其适用于示例:

var myEvent = {
   "Event":{
      "SessionTags":[
         {
            "SessionID":1,
            "TagID":"x"
         },
         {
            "SessionID":2,
            "TagID":"x"
         },
         {
            "SessionID":2,
            "TagID":"y"
         },
         {
            "SessionID":3,
            "TagID":"z"
         }
      ],
      "Sessions":[
         {
            "ID":1,
            "Name":"Advanced Tips",
         },
         {
            "ID":2,
            "Name":"Best Practices"
         },
         {
            "ID":3,
            "Name":"Code Fun"
         }
     ],
      "Tags":[
         {
            "ID":"x",
            "Name":"AJAX"
         },
         {
            "ID":"y",
            "Name":"Android"
         },
         {
            "ID":"z",
            "Name":"ASP.NET"
         }
      ]
   }
}