如何计算JavaScript对象的属性?

How do I count a JavaScript object's attributes?

本问题已经有最佳答案,请猛点这里访问。

假设我在javascript中有以下对象:

1
2
3
4
5
var object = {
 "key1":"value1",
 "key2":"value2",
 "key3":"value3"
};

如何确定对象中存在多少值?


您可以通过使用以下简单代码来实现这一点:

1
Object.keys(myObject).length


没有简单的答案,因为JavaScript中的每个对象都从—派生的Object—自动包含许多属性,您获得的确切属性集取决于特定的解释器以及您之前执行过的代码。所以,你必须以某种方式把你定义的和那些"免费"的分开。

有一种方法:

1
2
3
4
5
6
7
8
9
10
var foo = {"key1":"value1","key2":"value2","key3":"value3"};
Object.prototype.foobie = 'bletch'; // add property to foo that won't be counted

var count = 0;
for (var k in foo) {
    if (foo.hasOwnProperty(k)) {
       ++count;
    }
}
alert("Found" + count +" properties specific to foo");

第二行显示了其他代码如何向所有Object派生添加属性。如果在循环中删除hasOwnProperty()检查,则属性计数将至少增加到4。在除此代码之外还有其他javascript的页面上,如果其他代码也修改了Object原型,则它可能高于4。


Use underscore library, very useful: _.keys(obj).length.


1
2
3
4
5
 var miobj = [
  {"padreid":"0","sw":"0","dtip":"UNO","datos":[]},
  {"padreid":"1","sw":"0","dtip":"DOS","datos":[]}
 ];
 alert(miobj.length) //=== 2

但是

1
 alert(miobj[0].length) //=== undefined

这个功能很好

1
2
3
4
5
6
7
8
9
10
11
Object.prototype.count = function () {
    var count = 0;
    for(var prop in this) {
        if(this.hasOwnProperty(prop))
            count = count + 1;
    }
    return count;
}

alert(miobj.count()) // === 2
alert(miobj[0].count()) // === 4


可以迭代对象以获取键或值:

1
2
3
4
5
6
7
8
9
function numKeys(obj)
{
    var count = 0;
    for(var prop in obj)
    {
        count++;
    }
    return count;
}

它看起来像是一个"拼写错误",但只想指出您的示例是无效的语法,应该是be

1
var object = {"key1":"value1","key2":"value2","key3":"value3"};


此函数使用Mozilla的__count__属性(如果它可用),因为它比遍历每个属性更快。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function countProperties(obj) {
  var count ="__count__",
  hasOwnProp = Object.prototype.hasOwnProperty;

  if (typeof obj[count] ==="number" && !hasOwnProp.call(obj, count)) {
    return obj[count];
  }
  count = 0;
  for (var prop in obj) {
    if (hasOwnProp.call(obj, prop)) {
      count++;
    }
  }
  return count;
};

countProperties({
 "1": 2,
 "3": 4,
 "5": 6
}) === 3;


编辑:这将发生jquery错误,以及其他一些不便。您不应该使用它:(也许如果可以添加privaate方法而不是公共属性函数,这是可以的,但现在没有时间)。社区维基

请勿使用:

尽管默认情况下javascript的对象没有count函数,但是类很容易扩展,可以自己添加:

1
2
3
4
5
6
7
8
Object.prototype.count = function () {
    var count = 0;
    for(var prop in this) {
        if(this.hasOwnProperty(prop))
            count = count + 1;
    }
    return count;
}

这样在那之后你就可以执行

1
2
var object = {'key1': 'val1', 'key2':'val2', 'key3':'val3'};
console.log(object.count()); // 3

最后,如果希望在对象中具有计数功能,则需要从代码块1复制代码,并在执行时间早期(在调用计数之前)将其粘贴。

如果对你有用的话,告诉我!

当做,佩德罗


For those which will read this question/answers, here is a JavaScript implementation of Dictionary collection very similar as functionality as .NET one: JavaScript Dictionary


虽然它不是一个"真正的物体",但你可以一直这样做:

[cc lang="javascript"]var foo = [
{Key1:"key1