jQuery - 保存每一对而不明确声明每对

时间:2014-02-06 20:32:44

标签: jquery

我正在尝试解析此JSON文件(向下编辑以节省空间)

{
    "status": "ok",
    "count": 1,
    "data": {
        "1002009609": {
            "clan": null,
            "achievements": {
                "medal_le_clerc": 1,
                "tank_expert_ussr": 1,
                "evileye": 66,
                "mechanic_engineer_china": 1,
                "medal_nikolas": 0,
                "scout": 834
            },
                "all": {
                    "spotted": 152645,
                    "hits": 444587,
                    "battle_avg_xp": 423,
                    "draws": 1145,
                    "wins": 42739,
                },
                "company": {
                    "spotted": 18,
                    "hits": 84,
                    "battle_avg_xp": 573,
                    "draws": 0,
                    "wins": 19,
                },
                "max_xp": 2530
            },
            "nickname": "Definder"
        }
    }
}

但是,不是通过每个项目并使用data.data[i].____有没有办法存储每一对而不特别声明每个名称?

现在我正在使用它:

$.getJSON(linkClicked, function (data) {
    var person = data.data[id], array = [];
    if (person) {
        array.push('<h3>' + person.nickname + '</h3>');
        array.push('<div class="achievements"><h5>Achievements</h5><ul>');
        array.push('<li>diehard: ' + person.achievements.diehard + '</li>');
        array.push('<li>kamikaze: ' + person.achievements.kamikaze + '</li>');
        array.push('<li>iron_man: ' + person.achievements.iron_man + '</li>');
        array.push('</ul></div>'); //end of achievements
    }
    $('#person').html(array.join(''));
});

但是我希望我进入achievements并使用一系列循环推动每一对,然后转到all,依此类推。

到目前为止,这是项目的JSFiddle link

提前致谢!

3 个答案:

答案 0 :(得分:1)

jsFiddle Demo

你需要递归才能做到这一点。当然,您可以使用each或单个for in循环,但这些只会放弃复杂对象的表面。

使用父(人)从您的点击事件处理程序调用递归函数,并将数组传入构建。

if (person) {
 array.push('<h3>' + person.nickname + '</h3>');
 buildDisplay(person,array,true);
}

接下来,制作递归buildDisplay函数。

function buildDisplay(parent,arr,top){
    for( var item in parent ){
        if(toString.call(parent[item]) == "[object Object]"){
            arr.push('<div class="'+item+'"><h5>'+item+'</h5><ul>');
            buildDisplay(parent[item],arr,false);
            arr.push('</ul></div>');
        }else{
            if(top)continue;
            arr.push('<li>'+item+': ' + parent[item] + '</li>');
        }
    }
}

现在您已准备好查看the results

答案 1 :(得分:0)

您可以使用jQuery的each函数:

var PERSON_OBJECTS = ["achievements", "all", "company"];
function capitalize(string) {
  return string.replace(/\b[\w]/g, function(match){return match.toUpperCase()});
}

....

$.each(PERSON_OBJECTS, function(name) {
  array.push('<div class="'+name+'"><h5>'+capitalize(name)+'</h5><ul>');
  $.each(person[name], function(value, key) {
    array.push('<li>'+key+': '+value+'</li>');
  });
  array.push('</ul></div>');
});

答案 2 :(得分:0)

我建议 $。每次结束,因为 for 经常会产生意外结果。

var person = data.data[id], array = [];
array.push('<h3>' + person.nickname + '</h3>');
//begin of achievements
$.each(person.achievement, function(key, item){
  array.push('<li>' + key + ':' + item + '</li>');
});
array.push('</ul></div>'); //end of achievements