2012-10-23 58 views
3

我有一些JSON數據從REST調用中返回,我想要解析,添加總計,然後用新數據吐出數組。我已經得到了解析,循環和添加計算,並且可以將結果寫入頁面(請參閱:帖子:json sibling data,但我想進一步細分總計。這裏是我開始用JSON:從返回的JSON新的JavaScript數組

 
{"ResultSet":{ 

    "Result":[ 

    { 
     "file_size":"722694", 
     "desc":"description1", 
     "format":"GIF" 
    }, 

    { 
     "file_size":"19754932", 
     "desc":"description1", 
     "format":"JPEG" 
    }, 

    { 
     "file_size":"778174", 
     "desc":"description2", 
     "format":"GIF" 
    }, 

    { 
     "file_size":"244569996", 
     "desc":"description1", 
     "format":"PNG" 
    }, 

    { 
     "file_size":"466918", 
     "desc":"description2", 
     "format":"TIFF" 
    } 

    ] 

}} 

我知道了返回爲每個不同的「遞減」的總數(看到答案https://stackoverflow.com/a/13016615/1766026),但現在我想進一步打破它一步並顯示總計爲每一個 「遞減」,每個 「格式」,所以新的輸出將如下所示:

說明1:444MB(222MB TIFF,111MB GIF,111MB JPEG)

內容描述2:333MB(111MB PNG,111MB TIFF,111MB JPEG)

其中並非所有返回的項目都具有相同種類的文件格式。

(是的,我知道這些數字不從JSON加起來 - 這只是一個例子)

我想這可以通過推動的結果,一種新的基於陣列(S)來完成在匹配元素上迭代,然後吐出到頁面。

也許新的數組/對象看起來像這樣?

 
{ 
    "desc":"description1", 
    "TIFF":"222", 
    "GIF:"111", 
    "JPEG:"111" 
}, 
{ 
    "desc":"description2", 
    "PNG":"111", 
    "TIFF:"111", 
    "JPEG":"111" 
} 

我剛纔看到這個:How do I create JavaScript array (JSON format) dynamically?我想那會是一個開始的地方?

(請原諒可能不當用語 - 我做的主要是前端的工作,這樣的東西是相當新的給我 - 禮貌建設性的批評欣然接受)

+0

我會指出,雖然你的例子是相對微不足道的,你正朝着客戶端而不是服務器的方向進行處理。這可能有很好的理由,但如果可以讓服務器返回彙總數據,那麼從長遠來看,它可以爲您節省一些痛苦。這是SQL設計的一種東西,雖然它可以用其他語言完成,但如果希望它具有靈活性,則通常最終會爲所有聚合場景提供大型複雜庫。 – Basic

+0

這是針對使用其自己的REST API來提取此類信息的網絡應用程序。我們使用javascript/AJAX/JSON完成大部分頁面顯示。所有這些信息都可以通過REST獲得,所以我們希望儘可能使用它。如果結果太慢,我們可能會深入服務器端代碼來吐出一些HTML。感謝您的輸入。 – mflorida

+0

我完全理解 - 自己做得很好。我的UI經常會因爲這個原因而最終要求'/ StatsBy/DocType','/ StatsBy/Author'等。無論如何,歡迎來到SO。希望能夠在你身邊看到 – Basic

回答

1

是。迭代數組並從中構建對象。

var arr = parsedObj.ResultSet.Result; 

var byDesc = {}; // an object as a key-value-map 
for (var i=0; i<arr.length; i++) { 
    var desc = arr[i].desc, 
     format = arr[i].format; 
    if (! (desc in byDesc)) 
     byDesc[desc] = {}; 
    if (! (format in byDesc[desc])) 
     byDesc[desc][format] = 0; 
    byDesc[desc][format] += (+arr[i].file_size); // parseInt 
} 

現在我們已經有了一個對象與格式和說明的filesizes:

{"description1":{"GIF":722694,"JPEG":19754932,"PNG":244569996},"description2":{"GIF":778174,"TIFF":466918}} 

以獲得所需的輸出,我們只是列舉這個對象:

var output = []; 
for (var desc in byDesc) { 
    var total = 0, 
     formats = []; 
    for (var format in byDesc[desc]) { 
     formats.push(Math.round(byDesc[desc][format]/1000)+"MB "+format); 
     total += byDesc[desc][format]; 
    } 
    output.push(desc+": "+Math.round(total/1000)+"MB ("+formats.join(", ")+")"); 
} 
return output.join("\n"); 

,我們得到

description1: 265048MB (723MB GIF, 19755MB JPEG, 244570MB PNG) 
description2: 1245MB (778MB GIF, 467MB TIFF) 
+0

我得到了第一部分代碼工作。首先,我調整它在一個現有的jQuery $ .each循環中工作,它正在做其他一些事情。在console.debug(byDesc);'顯示出來很好。但是,如何訪問頂級輸出(**「description1」**等)?我無法得到像你所顯示的輸出。它不做任何事情,我不知道如何使用'return'來渲染輸出(請原諒我的原始javascript新手主義,我主要使用jQuery做前端工作)。如果可能,我想用jQuery的'.append()'函數進行渲染。謝謝! – mflorida

+0

下面是我得到的輸出 - 只有一行:** undefined:3.738 GB(2.082 GB DICOM,51.65 MB GIF,1.605 GB NIFTI,178 KB)**使用此代碼:'$('body')。append( output.join( 「\ n」));'。如何訪問頂級「desc」名稱? – mflorida