从返回的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?我想那会是一个开始的地方?
(请原谅可能不当用语 - 我做的主要是前端的工作,这样的东西是相当新的给我 - 礼貌建设性的批评欣然接受)
是。迭代数组并从中构建对象。
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)
我得到了第一部分代码工作。首先,我调整它在一个现有的jQuery $ .each循环中工作,它正在做其他一些事情。在console.debug(byDesc);'显示出来很好。但是,如何访问*输出(**“description1”**等)?我无法得到像你所显示的输出。它不做任何事情,我不知道如何使用'return'来渲染输出(请原谅我的原始javascript新手主义,我主要使用jQuery做前端工作)。如果可能,我想用jQuery的'.append()'函数进行渲染。谢谢! – mflorida
下面是我得到的输出 - 只有一行:** 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
我会指出,虽然你的例子是相对微不足道的,你正朝着客户端而不是服务器的方向进行处理。这可能有很好的理由,但如果可以让服务器返回汇总数据,那么从长远来看,它可以为您节省一些痛苦。这是SQL设计的一种东西,虽然它可以用其他语言完成,但如果希望它具有灵活性,则通常最终会为所有聚合场景提供大型复杂库。 – Basic
这是针对使用其自己的REST API来提取此类信息的网络应用程序。我们使用javascript/AJAX/JSON完成大部分页面显示。所有这些信息都可以通过REST获得,所以我们希望尽可能使用它。如果结果太慢,我们可能会深入服务器端代码来吐出一些HTML。感谢您的输入。 – mflorida
我完全理解 - 自己做得很好。我的UI经常会因为这个原因而最终要求'/ StatsBy/DocType','/ StatsBy/Author'等。无论如何,欢迎来到SO。希望能够在你身边看到 – Basic