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.