javascript对象中的元素数量

Get*_*ree 98 javascript collections elements javascript-objects

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

我找不到检索该信息的属性或方法.到目前为止,我只能想到在整个集合中进行迭代,但那是线性时间.
很奇怪,没有直接访问对象的大小,你不觉得.

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

var obj = new Object ;
Run Code Online (Sandbox Code Playgroud)

Chr*_*oph 148

虽然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;
}
Run Code Online (Sandbox Code Playgroud)

在支持ECMAScript 5的情况下,这也可以写成(Kudos to Avi Flax)

function countProperties(obj) {
    return Object.keys(obj).length;
}
Run Code Online (Sandbox Code Playgroud)

请记住,您还会错过不可枚举的属性(例如数组length).

如果你正在使用像jQuery,Prototype,Mootools这样的框架,那就是最新的炒作,检查它们是否带有自己的集合API,这可能是比使用本机JS对象更好的解决问题的方法.

  • 该死的我总是忘记hasOwnProperty.我告诉你,在.NET领域有太多时间.+1 (10认同)
  • Firefox4`__count__`不见了:( (5认同)
  • jQuery 为其从查询中获取的集合使用一个对象,并使用 length 属性公开该值。 (2认同)
  • 有没有办法在没有 for in 的情况下做到这一点?我处于相同类型的绑定中,但如果可能的话,我想让它通过 JSLint。 (2认同)
  • 为什么我们需要`hasOwnProperty()`? (2认同)

小智 87

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

Object.keys(obj).length
Run Code Online (Sandbox Code Playgroud)

(此处的浏览器支持)
(此处的Doc.keys 上的文档,包括可以添加到非ECMA5浏览器的方法)

  • 它可能不是编程效率最高的,但它是开发人员效率最高的. (9认同)
  • 这不是提出这个答案的正确问题。有了它,您将获取对象的所有键,将它们放入一个新创建的数组中,然后从该新数组中检索 length 属性。 (2认同)

Ind*_*eff 11

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

$(yourObject).length
Run Code Online (Sandbox Code Playgroud)

它对我的对象很好用,我已经把jQuery作为一个依赖.

  • 奇怪......这对我不起作用.我总是得到1. ZelkiN的答案对我有用. (4认同)
  • 此代码始终返回1.只有1个对象.它不计算其中的元素 (3认同)
  • 其中一位投票者检查过代码吗?它不起作用并且始终返回 1 - 无论 `yourObject` 包含什么。 (2认同)

ken*_*bec 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);
Run Code Online (Sandbox Code Playgroud)