3

我从 REST 调用返回了一些 JSON 数据,我想对其进行解析、添加总计,然后用新数据输出数组。我已经弄清楚了解析、循环和添加,并且可以将结果写在页面上(参见帖子:json 兄弟数据,但我想进一步分解总数。这是我开始的 JSON:

{“结果集”:{

    “结果”:[

    {
        "file_size":"722694",
        “描述”:“描述1”,
        “格式”:“GIF”
    },

    {
        "file_size":"19754932",
        “描述”:“描述1”,
        “格式”:“JPEG”
    },

    {
        "file_size":"778174",
        “描述”:“描述2”,
        “格式”:“GIF”
    },

    {
        "file_size":"244569996",
        “描述”:“描述1”,
        “格式”:“PNG”
    },

    {
        "file_size":"466918",
        “描述”:“描述2”,
        “格式”:“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 中加起来的——这只是一个例子)

我认为这可以通过将结果推送到基于匹配元素的新数组然后迭代并吐出到页面来完成。

也许新的数组/对象看起来像这样?

{
    “描述”:“描述1”,
    "TIFF":"222",
    "GIF:"111",
    "JPEG:"111"
},
{
    “描述”:“描述2”,
    "PNG":"111",
    "TIFF:"111",
    “JPEG”:“111”
}

我刚刚看到这个:如何动态创建 JavaScript 数组(JSON 格式)?我想这将是一个开始的地方?

(请原谅可能的不当术语——我主要做前端工作,这种东西对我来说很新——礼貌的建设性批评很乐意接受)

4

1 回答 1

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)
于 2012-10-23T23:40:05.813 回答