2013-07-16 3 views
0

Нужно выполнить итерацию над объектом JSON для создания отчета (табличный отчет в структуре таблицы).Удалить дубликат на JSON-итерации

Отчет будет в основном состоять из списка историй & связанных с ним задач.

QueryResults = { 
    "Results": [ 
     { 
      "Name" : "Tech Design", 
      "State" : "Completed", 
      "StoryName" : "FB Integration" 
     }, 
     { 
      "Name" : "Development", 
      "State" : "In-Progress", 
      "StoryName" : "FB Integration" 
     }, 
     { 
      "Name" : "QA Testing", 
      "State" : "Not Started", 
      "StoryName" : "FB Integration" 
     }, 
     { 
      "Name" : "Front End Development", 
      "State" : "Completed", 
      "StoryName" : "FB Integration" 
     }, 
     { 
      "Name" : "Tech Design", 
      "State" : "Not Started", 
      "StoryName" : "Twitter Integration" 
     }, 
     { 
      "Name" : "Development", 
      "State" : "Not Started", 
      "StoryName" : "Twitter Integration" 
     } 
    ] 
} 

HTML для заполнения:

<table> 
    <tr> 
     <td>StoryName</td> 
     <td>TechDesign</td> 
     <td>FED</td> 
     <td>QA</td> 
     <td>Development</td> 
    </tr> 
    <tr> 
     <td>FB Integration</td> 
     <td>Completed</td> 
     <td>Completed</td> 
     <td>In-Progress</td> 
     <td>In-Progress</td> 
    </tr> 
    ...... 
    ...... 
</table> 

Сценарий:

for(var i=0; i < QueryResults.Results.length; i++) { 
    data+= '<tr><td>' + QueryResults.Results[i].StoryName + '</td><td>' + QueryResults.Results[i].State + '</td></tr>'; 
} 

// it will list down all the story name i.e. same story name multiple times 

Пожалуйста, предоставьте мне указатели, чтобы удалить повторяющиеся имена сюжетные во время прохождения по JSON и заполнить соответствующие детали в других столбцах ,

+2

Что должно произойти с дубликатами? Вы хотите отбросить их? Если да, какой из них вы хотите сохранить? – MCL

+0

Нам нужно выбрать имя и статус задачи из повторяющихся записей и не печатать имя истории для отображения дважды. –

ответ

3

Вы не хотите удалять повторяющиеся записи, вы хотите объединить их в одно имя.

var stories = {}; 
for (var i=0; i<QueryResults.Results.length; i++) { 
    var result = QueryResults.Results[i], 
     name = result.StoryName 
    if (!(name in stories)) 
     stories[name] = {}; 
    stories[name][result.Name] = result.State; 
} 
/* console.log(stories): 
{ 
    "FB Integration":{"Tech Design":"Completed","Development":"In-Progress","QA Testing":"Not Started","Front End Development":"Completed"}, 
    "Twitter Integration":{"Tech Design":"Not Started","Development":"Not Started"} 
} */ 

Теперь вы можете построить таблицу из этого.

var keys = []; 
for (var i=0; i<QueryResults.Results.length; i++) { 
    var n = QueryResults.Results[i].Name; 
    if (keys.indexOf(n) == -1) 
     keys.push(n); 
} 
var data = "<table><tr><th>Story Name</th>"; 
for (var i=0; i<keys.length; i++) 
    data += "<th>"+keys[i]+"</th>"; 
data += "</tr>"; 
for (var storyname in stories) { 
    data += "<tr><th>"+storyname+"</th>"; 
    for (var i=0; i<keys.length; i++) 
     data += "<td>"+(stories[storyname][keys[i]] || "n.a.")+"</td>"; 
    data += "</tr>"; 
} 
data += "</table>"; 

Если вы хотите, чтобы обеспечить определенный порядок или использовать пользовательский заголовок таблицы, вы, конечно, можно также использовать статический keys массив:

var keys = ["Tech Design","Front End Development","QA Testing","Development"]; 
var data = "<table><tr><td>StoryName</td><td>TechDesign</td><td>FED</td><td>QA</td><td>Development</td></tr>"; 
for (storyname in stories) { 
… 
+0

просто просто. Вы просто решили, что я застрял с последних 3 часов. Большое спасибо Bergi за подробное описание кода. что-то новое и освежающее для меня с JSON-итерацией. –

+0

также создал скрипку с вашим кодом. http://jsfiddle.net/CUmMV/ –

Смежные вопросы