代码之家  ›  专栏  ›  技术社区  ›  GetFree

javascript对象中的元素数

  •  85
  • GetFree  · 技术社区  · 15 年前

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


    奇怪的是,你不认为没有直接的途径可以知道物体的大小吗。


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

    var obj = new Object ;
    
    6 回复  |  直到 11 年前
        1
  •  179
  •   Community Egal    7 年前

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

    过去,Mozilla的Javascript变体公开了 non-standard __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之类的框架,不管最新的宣传是什么,请检查它们是否有自己的collections API,这可能是比使用本机JS对象更好的解决方案。

        2
  •  118
  •   ZelkiN    11 年前

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

    Object.keys(obj).length
    

    (浏览器支持来自 here )
    (Object.keys上的文档) here ,包括可添加到非ECMA5浏览器的方法)

        3
  •  8
  •   IndelibleHeff    9 年前

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

    $(yourObject).length
    

        4
  •  6
  •   kennebec    15 年前
    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);
    
        5
  •  1
  •   Peter Bailey    15 年前

    好吧,除非切换到阵列,否则无法可靠地执行此操作。老实说, 看起来很奇怪——在我看来,数组是可数的,而对象不是。

    也许你能得到的最接近的是这样的东西

    // 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
    

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

        6
  •  0
  •   annakata    15 年前

    编辑:向我指出你想要一个O(1)。据我所知,恐怕不存在这样的方式。