如何过滤json数组中的元素?

时间:2012-03-13 14:39:12

标签: php javascript json

我正在一个社交网站上工作,用户可以在这里互相发送消息。我正在向php文件发送ajax请求以获取用户以json格式接收的消息,如下所示:

  {"messages":[
{"mid":"1","name":"Sam","msg":"Hi Anna"},
{"mid":"4","name":"Kelly","msg":"Hi Anna"},
{"mid":"5","name":"Sam","msg":"Hi Anna"},
{"mid":"7","name":"Sam","msg":"Hello Anna"},
{"mid":"8","name":"Kelly","msg":"Anna"} ]}

在上述场景中,用户“Anna”正在接收来自用户“Sam”和“Kelly”的消息。 现在我需要解析这个json结构以分离每个用户的响应,并将它们显示给Anna。

我如何解析这个json数组以获得2个javascript数组,以便我可以循环它们并显示响应?

2 个答案:

答案 0 :(得分:3)

假设您已将JSON解码并转换为javascript变量:

var response = {
  "messages":[
    {"name":"Sam","msg":"Hi Anna"},
    {"name":"Kelly","msg":"Hi Anna"},
    {"name":"Sam","msg":"Hi Anna"},
    {"name":"Sam","msg":"Hello Anna"},
    {"name":"Kelly","msg":"Anna"}
  ]
};

var dataByUser = {}, userName;
var msgs = response.messages;

for (var i = 0; i < msgs.length; i++) {
    userName = msgs[i].name;
    // if we don't have any msgs for this user, then initialize their data structure
    if (!dataByUser[userName]) {
        dataByUser[userName] = [];
    }
    dataByUser[userName].push(msgs[i].msg);
}

这会产生如下所示的数据结构:

var dataByUser = {
    "Sam" : ["Hi Anna", "Hi Anna", "Hello Anna"],
    "Kelly": ["Hi Anna", "Anna"]
};

然后,您可以随时循环使用:

for (var userName in dataByUser) {
    // dataByUser[userName] is the array of messages from userName
}

或者如果你知道你感兴趣的userName,你可以直接索引它:

dataByUser["Sam"]     // contains array of messages from Sam

编辑:显然,您编辑了问题并添加了一个消息ID(mid),当我写这个答案时,它不在数据中。目前还不清楚你想用该消息ID做什么。如果需要,每个用户的数据可以是一个对象数组,而不是一个字符串数组,其中每个对象都包含消息ID和消息。

答案 1 :(得分:1)

将即将编码的json转换为变量,如

    var messages = jQuery.parseJSON('StringSourceOfYourJsonEncoded');
    jQuery(messages).each(function(index,value) {
             // GET THE OBJECT DATA FROM HERE. 
             alert(messages.msg);
    });

希望,这会有效。