4

我的 JSON 由 ajax 请求返回并存储在data变量中。

JSON 看起来像这样(第一行是邮政编码/邮政编码,每个请求都不同):

  {
      "ML1 4EQ":{
          "ExchangeCode":"WSMOT",
          "ExchangeName":"MOTHERWELL",
          "Options":{
              "10":{
                  "Preference":"3rd Party Tail (TTB)",
                  "Supplier 1":9591,
                  "Supplier 2":3581,
                  "Wholesale":5200,
                  "RRP":6500
              },

等等其他9个Options

        }
    }
}

我正在尝试计算Options返回的数量,但是我从阅读其他问题中尝试的所有内容似乎都无法从返回 undefined 到仅返回3而不是返回10(认为我计算错误级别)。

这些包括

var key, results = 0;
for (var k in data) { // only simple cross browser way to get the first property
    var obj = data[k];
    for (key in obj) {
        results++;
        count = results;
    }
    return; // no need to go further, we have counted the options in the postcode object
}
4

2 回答 2

6

这将计算第一个对象内的选项总数。

var count = 0;
for(var key in data){
  for(var i in data[key].Options){
    count++;   
  }
  break;
}

小提琴

于 2013-07-16T08:24:18.233 回答
1

计算 an 中的属性数量Object并不完全简单。没有一个属性会直接告诉你,如果你for...in超过它们来计算它们,你也会得到继承的属性,所以如果有人在你上面定义了任何东西,Object.prototype你会得到错误的答案。

在 ECMAScript 第五版中,您会得到getOwnPropertyNames它返回一个非继承属性名称的数组:

var options= {'1': 'a', '2': 'b'};
Object.getOwnPropertyNames(options).length; // 2

对于尚不支持第五版的浏览器(主要是 IE<=8),您可以对其进行填充:

if (!('getOwnPropertyNames' in Object)) {
    Object.getOwnPropertyNames= function(o) {
        var names= [];
        for (var k in o)
            if (Object.hasOwnProperty(k))
                names.push(k);
        return names;
    };
}

但是,如果您可以控制 JSON 输出的格式,我强烈建议您将OptionsObject 转换为普通数组,这似乎可以更好地为您的数据建模。使用数组,您可以简单地使用Options.length.

于 2013-07-16T08:29:48.850 回答