我从一个我要解析的REST调用中返回了一些JSON数据,添加了总数,然后用新数据吐出数组。我已经解析,循环并添加了想法,并且可以在页面(请参阅帖子:json sibling data)上写下结果,但我想进一步细分总数。这是我开始使用的JSON:
{"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" } ] }}
我已经让它返回每个不同的“desc”的总数(请参阅答案:https://stackoverflow.com/a/13016615/1766026),但现在我想进一步分解它并显示总数每个“desc”与每个“格式”,所以新的输出看起来像:
description1:444MB(222MB TIFF,111MB GIF,111MB JPEG)
description2:333MB(111MB PNG,111MB TIFF,111MB JPEG)
并非所有返回的项目都具有相同类型的文件格式。
(是的,我知道这些数字不会从JSON中加起来 - 这只是一个例子)
我认为这可以通过将结果推送到基于匹配元素的新数组然后迭代到该页面并吐出到页面来完成。
也许新的数组/对象看起来像这样?
{ "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 :(得分: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
}
现在我们有了一个按格式和描述提供文件大小的对象:
{"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)