2014-02-06 91 views
1

我試圖解析此JSON文件(編輯,以節省空間)jQuery的 - 保存每一對沒有明確聲明每一對

{ 
    "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

在此先感謝!

+1

是的,你可以做一個for-in循環的成就對象。 –

回答

1

jsFiddle Demo

您將需要遞歸來做到這一點。當然,您可以使用each或單個for in循環,但這些只會放棄複雜對象的表面。

使用父(人)並傳入要構建的數組來調用您的click事件處理函數的遞歸函數。

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

+0

哇,這是一個非常優雅的解決方案,謝謝! – NoahLE

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>'); 
}); 
0

我建議$。每個超過了作爲往往能產生意想不到的效果。

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