我有一些从 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”的总数与每个“格式”所以新的输出看起来像:
描述 1:444MB(222MB TIFF、111MB GIF、111MB JPEG)
描述 2: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? 我猜这是一个起点?
(请原谅可能的不当术语 - 我主要从事前端工作,这类工作对我来说很新 - 很乐意接受礼貌的建设性批评)
最佳答案
是的。迭代数组并从中构建对象。
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)
关于javascript - 来自返回的 JSON 的新 javascript 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13040875/