从返回的JSON新的JavaScript数组

问题描述:

我有一些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://*.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

是。迭代数组并从中构建对象。

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