JavaScript对象中的元素数目

有没有一种方法来(从某处)的JavaScript对象的元素数量? (即恒定的时间复杂度)。

我无法find一个属性或方法来检索该信息。 到目前为止,我只能想到通过整个集合进行迭代,但这是线性时间。
奇怪的是没有直接访问对象的大小,你不觉得。

编辑:
我在谈论Object对象(通常不是对象):

 var obj = new Object ; 

虽然JS实现可能会在内部跟踪这样一个值,但没有标准的方法来获取它。

过去,Mozilla的Javascript变体暴露了非标准的__count__ ,但是它已经被删除了版本1.8.5。

对于跨浏览器脚本,你坚持显式迭代属性并检查hasOwnProperty()

 function countProperties(obj) { var count = 0; for(var prop in obj) { if(obj.hasOwnProperty(prop)) ++count; } return count; } 

在ECMAScript 5能力的情况下,这也可以写成( Avi Flax的荣誉)

 function countProperties(obj) { return Object.keys(obj).length; } 

请记住,你也会错过不可枚举的属性(例如数组的length )。

如果您使用的是像jQuery,Prototype,Mootools这样的框架,那么请检查它们是否带有自己的集合API,与使用本机JS对象相比,这可能是更好的解决scheme。

在任何ES5兼容的环境中做到这一点

 Object.keys(obj).length 

(浏览器支持从这里 )
(在这里的文档Object.keys,包括你可以添加到非ECMA5浏览器的方法)

如果您已经在构build中使用jQuery,请执行以下操作:

 $(yourObject).length 

它对我来说很好,对我来说,我已经有jQuery的依赖。

 function count(){ var c= 0; for(var p in this) if(this.hasOwnProperty(p))++c; return c; } var O={a: 1, b: 2, c: 3}; count.call(O); 

AFAIK,没有办法可靠地做到这一点,除非你切换到一个数组。 说实话, 似乎并不奇怪 – 这似乎是非常简单的数组是可数的,而对象不是。

可能最接近你会得到这样的事情

 // Monkey patching on purpose to make a point Object.prototype.length = function() { var i = 0; for ( var p in this ) i++; return i; } alert( {foo:"bar", bar: "baz"}.length() ); // alerts 3 

但是这会造成问题,至less是问题。 计算所有用户创build的属性,包括_length函数本身! 而在这个简单的例子中,你可以通过使用一个普通的函数来避免它,这并不意味着你可以阻止其他脚本执行此操作。 所以你会怎么做? 忽略函数属性?

 Object.prototype.length = function() { var i = 0; for ( var p in this ) { if ( 'function' == typeof this[p] ) continue; i++; } return i; } alert( {foo:"bar", bar: "baz"}.length() ); // alerts 2 

最后,我认为你应该抛弃让对象成为可数的想法,并找出另一种方法去做你正在做的事情。

数字/长度/维度的概念对于一个对象来说并不是真的有意义,需要它意味着你确实需要一个数组给我。

编辑:指出我,你想这个O(1)。 据我所知,恐怕没有这种方式。

您可以使用:

 ({ foo:55, bar:99 }).__count__ // is: 2 

已经从这里拿走了