【问题标题】:Javascript: Creating a Summary Object from a Series of Detail ObjectsJavascript:从一系列详细信息对象创建摘要对象
【发布时间】:2013-09-28 08:06:25
【问题描述】:

我正在迭代一堆看起来像这样的对象:

var tests = [{ date: 1379082017487,
  summary:
    {'Item A': 2069,
     'Item B': 8987,
     'Item C': 1890
    }},
{date: 1379082015968,
  summary:
    {'Item A': 1824,
     'Item B': 6758,
     'Item C': 3857
    }}];

我需要将数据组合成具有相同键的单个对象,以及包含组合值的数组:

{ date: [1379082017487, 1379082015968],
  summary:
   { 'Item A': [2069, 1824],
     'Item B': [8987, 6758],
     'Item C': [1890, 3857]
   }
}

到目前为止,我的策略是创建一个嵌套循环;遍历顶级对象并将它们的值添加到“日期”数组中。然后遍历“summary”对象,将这些值推送到代表每个键的数组中。最后,我会将数组重新添加在一起以形成我的单个输出对象。

我的大脑冻结在内部阵列上。它可以有不同数量的键(“项目”)。虽然在任何给定的代码运行中,这些键对于所有对象都具有相同的名称,但它们在运行之间可以具有不同的名称。内部循环不生成数组(如 [2069, 1824])。

到目前为止我有:

var testDates = [];
var itemVals = [];
// iterate over the outer objects
for (var record = 0; record < tests.length; record++) {
    testDates.push(tests[record].date); // this works fine

    // iterate over the inner 'summary' object:
    for (var itemName in tests[record]['summary']) {
        // doesn't produce the appropriate array
        itemVals.push([tests[record]['summary'][itemName]]);
    }

}

感谢您的建议!

【问题讨论】:

    标签: javascript arrays object


    【解决方案1】:

    我已经为您的问题编写了示例代码。请试试这个,让我知道它是否有效

    var tests = [{
      date: 1379082017487,
      summary: {
        'Item A': 2069,
        'Item B': 8987,
        'Item C': 1890
      }
    }, {
      date: 1379082015968,
      summary: {
        'Item A': 1824,
        'Item B': 6758,
        'Item C': 3857
      }
    }];
    var json = {
      date: [],
      summary: {}
    };
    for (var i = 0; i < tests.length; i++) {
      var dateJSON = tests[i];
      json.date.push(dateJSON.date);
      for (var key in dateJSON.summary) {
        if (dateJSON.summary.hasOwnProperty(key)) {
          if (json.summary[key] == null) {
            json.summary[key] = [];
          }
          json.summary[key].push(dateJSON.summary[key]);
        }
      }
    }
    

    【讨论】:

    • 这实际上是完美的。出于好奇,JSLint 说“使用 === 与 null 进行比较”。当我为if (json.summary[key] === null) 执行此操作时,json.summary[key].push(dateJSON.summary[key]); 行失败并显示“TypeError:无法调用未定义的方法'push'”。知道为什么会这样吗?
    • 当我使用 json.summary[key] === null 时,它返回 false,因此数组未初始化,因此出现错误“无法调用未定义的 'push'”。如果我与 (json.summary[key] === undefined) 进行比较,那么它会给我正确的结果,即 true 并且数组已初始化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多