【问题标题】:new javascript array from returned JSON来自返回 JSON 的新 javascript 数组
【发布时间】:2012-10-23 23:31:34
【问题描述】:

我从 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” 与每个“格式”,所以新的输出看起来像:

说明 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” }

我刚刚看到这个:How do I create JavaScript array (JSON format) dynamically? 我想这将是一个开始的地方?

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

【问题讨论】:

  • 我要指出,虽然您的示例相对微不足道,但您正朝着在客户端而不是服务器上进行处理的方向发展。这可能有充分的理由,但如果可以让服务器返回聚合数据,从长远来看,它可能会为您节省一些痛苦。这就是 SQL 设计的用途,虽然它可以用其他语言完成,但如果您希望它灵活,您通常会为所有聚合场景提供大型复杂库。
  • 这适用于使用自己的 REST API 来提取此类信息的 Web 应用程序。我们使用 javascript/AJAX/JSON 进行大部分页面显示。所有这些信息都可以通过 REST 获得,因此我们希望尽可能使用它。如果这最终变得太慢,我们很可能会深入到服务器端代码以吐出一些 HTML。感谢您的意见。
  • 我完全理解——而且我自己也非常了解。我的 UI 人员经常最终要求/StatsBy/DocType/StatsBy/Author 等...正是出于这个原因。无论如何,欢迎来到 SO。希望能见到你

标签: javascript jquery arrays json


【解决方案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)

【讨论】:

  • 我得到了第一块代码工作。首先是原样,然后我对其进行了调整以在现有的 jQuery $.each 循环中工作,该循环正在做一些其他的事情。 console.debug(byDesc); 表现不错。但是如何访问顶级输出(“description1” 等)?我无法像您显示的那样获得输出。它没有按原样做任何事情,我不确定如何使用 return 来呈现输出(请原谅我的原始 javascript 新手主义,我主要使用 jQuery 进行前端工作)。如果可能,我想使用 jQuery 的 .append() 函数进行渲染。谢谢!
  • 这是我得到的输出 - 只有一行:undefined: 3.738 GB (2.082 GB DICOM, 51.65 MB GIF, 1.605 GB NIFTI, 178 KB) 使用以下代码: $('body').append(output.join("\n"));。如何访问顶级“desc”名称?
猜你喜欢
  • 2019-01-21
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多