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

确定一个javascript对象有多少字段

  •  10
  • Tyler  · 技术社区  · 14 年前

    我有一个javascript对象,我正试图将其用作“hashmap”。钥匙总是串在一起的,所以我认为我不需要像中描述的那样复杂的东西。 this SO question . (我也不希望键的数目超过10,所以我不特别关心查找是O(n)对O(log n)等。)

    我只想让内置的JavaScript对象看起来没有什么功能,这是一种快速的方法来计算对象中的键值对的数量,比如Java的 Map.size 返回。当然,你可以这样做:

    function getObjectSize(myObject) {
      var count=0
      for (var key in myObject)
        count++
      return count
    }
    

    但这似乎有点老土和迂回。是否有“正确的方法”获取对象中的字段数?

    4 回复  |  直到 14 年前
        1
  •  3
  •   Nikita Rybak    14 年前

    更正:您需要检查 myObject.hasOwnProperty(key) 在每个迭代中,因为可以继承属性。例如,如果在循环之前执行此操作 Object.prototype.test = 'test' , test 阿斯洛会被计算在内吗?

    谈论你的问题:如果速度不重要,你可以定义一个助手函数。毕竟,我们为trim函数和其他简单的东西定义助手。很多javascript是“一种黑客和迂回”:)

    更新
    故障示例,根据要求。

    Object.prototype.test = 'test';
    var x = {};
    x['a'] = 1;
    x['b'] = 2;
    

    返回的计数将为3。

        2
  •  14
  •   Anurag    14 年前

    ECMAScript 5中有一种更简单的方法。

    Object.keys(..) 返回对象上定义的所有键的数组。长度可以调用。尝试铬:

    Object.keys({a: 1, b: 2}).length; // 2
    

    请注意,所有对象基本上都是JavaScript中的键/值对,而且它们也是非常可扩展的。你可以延长 Object.prototype 用一个 size 方法并在那里获取计数。然而,更好的解决方案是创建一个 HashMap 输入接口或使用现有的许多实现之一,然后定义 大小 关于它。下面是一个很小的实现:

    function HashMap() {}
    
    HashMap.prototype.put = function(key, value) {
        this[key] = value;
    };
    
    HashMap.prototype.get = function(key) {
        if(typeof this[key] == 'undefined') {
            throw new ReferenceError("key is undefined");
        }
        return this[key];
    };
    
    HashMap.prototype.size = function() {
        var count = 0;
    
        for(var prop in this) {
            // hasOwnProperty check is important because 
            // we don't want to count properties on the prototype chain
            // such as "get", "put", "size", or others.
            if(this.hasOwnProperty(prop) {
                count++;
            }
        }
    
        return count;
    };
    

    使用AS example ):

    var map = new HashMap();
    map.put(someKey, someValue);
    map.size();
    
        3
  •  0
  •   Community noseratio    7 年前

    你也可以这么做 myObject.length (数组中)

    但请看: JavaScript object size

        4
  •  0
  •   Matthew Flaschen    14 年前

    这就是你所能做的。显然,JavaScript对象不是为此设计的。这只会给出可枚举属性的数目。尝试 getObjectSize(Math) .