javascript对象中的元素数


103

有没有办法(从某处)获取javascript对象中元素的数量?(即恒定时间复杂度)。

我找不到检索该信息的属性或方法。到目前为止,我只能考虑对整个集合进行迭代,但这是线性时间。
奇怪的是,您无法直接访问对象的大小。

编辑:
我说的是Object对象(不是一般对象):

var obj = new Object ;

5
这里已经回答stackoverflow.com/questions/126100/... (OBJ)。长度Object.keys
口角

Answers:


155

尽管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,$ whatthe-the-newest-hype之类的框架,请检查它们是否带有自己的collections API,这可能比使用本机JS对象更好地解决您的问题。


11
该死的我总是忘记hasOwnProperty。我告诉你,.NET领域中的时间太多了。+1
annakata

2
jQuery将一个对象用于从查询中获取的集合,并使用length属性公开该值。
Nosredna,2009年

6
Firefox4 __count__不见了:(
Timo

1
有没有办法做到这一点?我处于相同类型的绑定中,但如果可能的话,我想使其通过JSLint。
路灯

1
我们为什么需要hasOwnProperty()
swisswiss

99

在任何与ES5兼容的环境中执行此操作

Object.keys(obj).length

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


2
这不是正确的答案。这样,您就可以获取对象的所有键,将它们放入新创建的数组中,然后从该新数组中检索length属性。
GetFree 2013年

11
它可能不是最有效的编程方法,但是最有效的开发人员。
superluminary

9

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

$(yourObject).length

它对我在对象上很好用,并且我已经有了jQuery作为依赖项。


5
奇怪...这对我不起作用。我总是得到1。ZelkiN的答案对我有用。
麦克罗丹(Mike

3
此代码始终返回1。只有1个对象。它不算其中的元素
BeRocket

5
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);

2

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

但这会产生问题,或者至少会带来问题。计算所有用户创建的属性,包括_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

最后,我认为您可能应该放弃使对象可计数的想法,并想出另一种方法来做您正在做的事情。


8
危险会鲁宾逊!难道不是原对对象!一切都源于Object,如果您要进行大量的JS工作,就会削弱客户端的处理方式。
annakata 2009年

5
呃...您没有阅读我在评论中写的部分“猴子故意打点以表达观点”-来吧,我故意这样做,以便人们不会对此有所了解。此外,即使我不提倡猴子修补,但如果您认为原型链如何在Javascript中工作,您会误解video.yahoo.com/watch/111585/1027823
Peter Bailey

所以..这是做还是不做?
OscarRyz 2012年

在“ Javascript:好的零件”中,他使用“ create()”方法对对象进行原型制作。我相信那是有关Javascript的权威书籍。
克里斯·杜特罗

1

数字/长度/维数的概念对于一个对象并没有多大意义,需要它表明您真的对我想要一个数组。

编辑:指向我指出您想要一个O(1)。据我所知,恐怕还没有这种方法。


他建议自己进行迭代,此解决方案就是这样。他需要一种O(1)方式来实现这一目标……
Thomas Hansen

你说得很对。确实应该更彻底地阅读问题。
annakata 2009年

实际上,对象是JS中最接近Map的东西。地图确实有长度。
Cristian Vrabie 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.