【问题标题】:How do I get number of arrays from an object如何从对象中获取数组的数量
【发布时间】:2013-07-25 09:02:32
【问题描述】:

我有一个以下格式的 JSON 网络服务。

 { Name:['a','b'], Name:['cd','ef'], Age:{...}, Address:{...} }. 

这里我在一个对象中有 2 个数组和 2 个对象,这些(数组和对象)数字可能会有所不同。我需要的是,我怎样才能从主对象中单独获取数组的数量?可能有另一种方法可以解决我的问题,但我需要将我的代码放在 .JS(javascript 文件)中。


当我尝试时:

Object.keys(mainobject).length; 

它给出了主对象中数组+对象的总数。

【问题讨论】:

  • 您需要 IE8 支持吗?
  • 解析 JSON,迭代它的属性,并为每个值为数组的属性增加一个计数器。
  • 我不认为你可以在同一个对象中有两个 Name 键。
  • @c.P.u1 你可以。最近出现的键将覆盖之前的任何键。

标签: javascript arrays json object


【解决方案1】:
var data = { Name:['a','b'], OtherName:['cd','ef'], Age:{a: 12}, Address:{a: 'asdf'} }

var numberOfArrays = Object.keys(data).filter(function(key) {
    return data[key] instanceof Array; //or Array.isArray(data[key]) if the array was created in another frame
}).length;

alert(numberOfArrays);

注意:这在旧版本的 IE 中不起作用

jsFiddle

要使其与不支持它的浏览器一起工作,请使用 MDN 的 shim:

Object.keys

Array.filter

【讨论】:

  • 感谢@c.P.u1 的帮助。是否可以根据特定的数组名称进行计数。
  • 这在旧 IE 中不起作用;如果您提供的只是移动设备和新浏览器,那可能没问题。
  • @user2546074,filter 中的关键参数保存了属性的名称。例如,如果您想要名称为“OtherName”的数组计数:return data[key] instanceof Array && key === 'OtherName'
  • 感谢@c.P.u1 的帮助。
【解决方案2】:

我会写一些东西来计算所有类型

var obj = {
    k1: ['a','b'], k2: ['cd','ef'],
    k3: 0, k4: 1,
    k5: {a:'b'},
    k6: new Date(),
    k7: "foo"
};

function getType(obj) {
    var type = Object.prototype.toString.call(obj).slice(8, -1);
    if (type === 'Object') return obj.constructor.name;
    return type;
}

function countTypes(obj) {
    var k, hop = Object.prototype.hasOwnProperty,
        ret = {}, type;
    for (k in obj) if (hop.call(obj, k)) {
        type = getType(obj[k]);
        if (!ret[type]) ret[type] = 1;
        else ++ret[type];
    }
    return ret;
}

var theTypes = countTypes(obj);
// Object {Array: 2, Number: 2, Object: 1, Date: 1, String: 1}

现在如果我只想知道数组的数量

var numArrays = theTypes.Array || 0; // 2 Arrays in this example

【讨论】:

    【解决方案3】:

    您可以尝试检查对象的每个成员的类型。

    var count = 0;
    for (var foo in mainobject) {
        if (foo instanceof Array) count++;
    }
    

    现在您所要做的就是读取count 的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多