3

REST 呼び出しから返された JSON データを解析し、合計を追加してから、新しいデータを含む配列を吐き出します。解析、ループ、および追加を把握し、ページに結果を書き込むことができます(投稿を参照してください: json sibling data )が、合計をさらに分類したいと思います。これが私が始めている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」と各「format」を使用すると、新しい出力は次のようになります。

説明 1: 444MB (222MB TIFF、111MB GIF、111MB JPEG)

description2: 333MB (111MB PNG、111MB TIFF、111MB JPEG)

返されるすべてのアイテムが同じ種類のファイル形式を持つわけではありません。

(はい、これらの数値が JSON から加算されないことはわかっています。これは単なる例です)

これは、一致する要素に基づいて結果を新しい配列にプッシュし、それを反復処理してページに吐き出すことで実行できると考えています。

たぶん、新しい配列/オブジェクトは次のようになりますか?

{
    "説明":"説明1",
    "TIFF":"222",
    "GIF:"111",
    "JPEG:"111"
}、
{
    "説明":"説明2",
    "PNG":"111",
    "TIFF:"111",
    "JPEG":"111"
}

私はちょうどこれを見ました: JavaScript 配列 (JSON 形式) を動的に作成するにはどうすればよいですか? それが出発点の1つになると思いますか?

(不適切な用語の可能性があることをご容赦ください - 私は主にフロントエンドの仕事をしており、この種のものは私にとってかなり新しいものです - 丁寧で建設的な批判は喜んで受け入れます)

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 に答える