有没有办法从对象中获取元素数量?

时间:2010-08-20 09:06:28

标签: javascript

让我详细解释一下。我跟下了一个对象 -

{
    "OBJECT1" : {
        "NAME1" : "VALUE1",
        "NAME2" : "VALUE2",
        "NAME3" : "VALUE3"
     },
     "OBJECT2" : {
        "NAME4" : "VALUE4",
        "NAME5" : "VALUE5"
     }
}

从这个对象,我想获得像OBJECT1 = 3中的元素数量和OBJECT2中的元素数量= 2的东西。如果可以的话,可以使用javascript。 基本上我要做的是,动态地遍历对象中可用的名称值对,这样如果有人向对象添加了另一个元素,我就不必更改我的代码了。

此外,还排除了任何替代方案,因为我只允许在我的用例中使用对象。

3 个答案:

答案 0 :(得分:9)

如果不转换对象,您可以迭代遍历对象计数属性,如下所示:

function countObjectProperties(obj)
{
    var count = 0;
    for(var i in obj)
        if(obj.hasOwnProperty(i))
            count++;

    return count;
}

根据我在下面的评论中所说的扩展您需要使用hasOwnProperty的原因,您可能会遇到一个问题,其中库或浏览器已向Objects添加了方法和属性,以避免计算这些我们检查在计算它之前hasOwnPropertyMore details at MSDNMozilla Developer Center

答案 1 :(得分:4)

对于表示对象的JSON字符串(这是您的情况),您不能使用任何长度属性。你需要在对象中循环(参见Kristoffer S Hansen的回答)。

如果它代表数组,您可以使用以下内容获取长度:

var len = arr.length;

JQuery使其变得更简单:

var len = $(JSON).length;

答案 2 :(得分:1)

按照问题中的说明回答更广泛的目标:

要循环浏览属性,可以使用for..in结构:

for (var item in myobject) {
  // some browsers add more properties to every object, we don't want those
  if (myobject.hasOwnProperty(item)) {
    do_something(item);
  }
}

假设myobject是您问题中的对象,则会循环显示该对象并调用do_something(OBJECT1)do_something(OBJECT2);您可以使用相同的构造来遍历子对象:

// loop through OBJECT1 and OBJECT2
for (var item in myobject) {
  // some browsers add more properties to every object, we don't want those
  if (myobject.hasOwnProperty(item)) {
    // loop through the item's children
    for (var pair in item) {
      if (item.hasOwnProperty(pair)) {
        // each of the name:value pairs will be passed to this
        do_something_else(item,pair);
      }
    }
  }
}