计算对象的键/财产数的最快方法是什么?是否可以在不迭代对象的情况下执行此操作?即,不做:

var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) ++count;

(Firefox确实提供了一个神奇的__count__属性,但在版本4左右,这个属性被删除了。)


当前回答

要迭代AviFlax的答案,Object.keys(obj).length对于没有绑定函数的对象是正确的。

例子:

obj = {"lol": "what", owo: "pfft"};
Object.keys(obj).length; // should be 2

arr = [];
obj = {"lol": "what", owo: "pfft"};
obj.omg = function(){
    _.each(obj, function(a){
        arr.push(a);
    });
};
Object.keys(obj).length; // should be 3 because it looks like this
/* obj === {"lol": "what", owo: "pfft", omg: function(){_.each(obj, function(a){arr.push(a);});}} */

避免这种情况的步骤:

不要将函数放在要计算键数的对象中使用单独的对象或专门为函数创建新对象(如果要使用object.keys(obj).length计算文件中有多少个函数)

另外,是的,我在示例中使用了Node.js中的_或Undercore.js模块。

文档可以在这里找到,也可以在GitHub和其他各种信息上找到。

最后是一个lodash实现https://lodash.com/docs#size

_.size(对象)

其他回答

我尝试让它对所有对象都可用,如下所示:

Object.defineProperty(Object.prototype,
                      "length",
                      {
                          get() {
                              if (!Object.keys) {
                                  Object.keys = function (obj) {
                                      var keys = [],k;
                                      for (k in obj) {
                                          if (Object.prototype.hasOwnProperty.call(obj, k)) {
                                              keys.push(k);
                                          }
                                      }
                                      return keys;
                                  };
                              }
                              return Object.keys(this).length;
                      },});

console.log({"Name":"Joe", "Age":26}.length) // Returns 2

您可以使用以下代码:

if (!Object.keys) {
    Object.keys = function (obj) {
        var keys = [],
            k;
        for (k in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, k)) {
                keys.push(k);
            }
        }
        return keys;
    };
}

然后,您也可以在较旧的浏览器中使用此功能:

var len = Object.keys(obj).length;

标准的Object实现(ES5.1对象内部财产和方法)不要求Object跟踪其键/财产的数量,因此在不显式或隐式迭代其键的情况下,应该没有标准的方法来确定Object的大小。

以下是最常用的替代方案:

1.ECMAScript的Object.keys()

对象.键(obj).长度;通过内部迭代键来计算临时数组并返回其长度。

优点-可读和干净的语法。如果本机支持不可用,则不需要库或自定义代码,除非使用垫片Cons—由于创建阵列而产生的内存开销。

2.基于库的解决方案

本主题其他地方的许多基于库的示例在其库的上下文中都是有用的习惯用法。然而,从性能的角度来看,与完美的无库代码相比,没有什么可获得的,因为所有这些库方法实际上都封装了for循环或ES5 Object.keys(原生或填充)。

3.优化for循环

由于函数调用开销,这种for循环最慢的部分通常是.hasOwnProperty()调用。因此,当我只需要一个JSON对象的条目数时,如果我知道没有代码也不会扩展object.prototype,我就跳过.hasOwnProperty()调用。

否则,通过使k为本地(vark),并使用前缀递增运算符(++count)而不是后缀,可以稍微优化代码。

var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;

另一个想法依赖于缓存hasOwnProperty方法:

var hasOwn = Object.prototype.hasOwnProperty;
var count = 0;
for (var k in myobj) if (hasOwn.call(myobj, k)) ++count;

在给定的环境中,这是否更快是一个基准测试的问题。无论如何,预期的性能增益非常有限。

如果前面答案中的jQuery不起作用,请尝试

$(Object.Item).length

要迭代AviFlax的答案,Object.keys(obj).length对于没有绑定函数的对象是正确的。

例子:

obj = {"lol": "what", owo: "pfft"};
Object.keys(obj).length; // should be 2

arr = [];
obj = {"lol": "what", owo: "pfft"};
obj.omg = function(){
    _.each(obj, function(a){
        arr.push(a);
    });
};
Object.keys(obj).length; // should be 3 because it looks like this
/* obj === {"lol": "what", owo: "pfft", omg: function(){_.each(obj, function(a){arr.push(a);});}} */

避免这种情况的步骤:

不要将函数放在要计算键数的对象中使用单独的对象或专门为函数创建新对象(如果要使用object.keys(obj).length计算文件中有多少个函数)

另外,是的,我在示例中使用了Node.js中的_或Undercore.js模块。

文档可以在这里找到,也可以在GitHub和其他各种信息上找到。

最后是一个lodash实现https://lodash.com/docs#size

_.size(对象)