确定Javascript对象有多少个字段

时间:2010-07-01 00:50:24

标签: javascript map size

我有一个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
}

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

4 个答案:

答案 0 :(得分:14)

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

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

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

请注意,所有对象基本上都是JavaScript中的键/值对,并且它们也是非常可扩展的。您可以使用Object.prototype方法扩展size并获取计数。但是,更好的解决方案是创建HashMap类型接口或使用其中许多现有实现之一,并在其上定义size。这是一个很小的实现:

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;
};

用作(example):

var map = new HashMap();
map.put(someKey, someValue);
map.size();

答案 1 :(得分:3)

更正:您需要在每次迭代中检查myObject.hasOwnProperty(key),因为可以有继承的属性。例如,如果您在循环Object.prototype.test = 'test'之前执行此操作,则test也将被计算在内。

谈论你的问题:如果速度无关紧要,你可以定义一个辅助函数。毕竟,我们为trim函数和其他简单的东西定义帮助器。很多javascript是“一种hacky和roundabout”:)

<强>更新
失败示例,请求。

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

返回的计数为3。

答案 2 :(得分:0)

您也可以myObject.length(在数组中)

没关系,请看:JavaScript object size

答案 3 :(得分:0)

这就是你所能做的一切。显然,JavaScript对象不是为此而设计的。这只会为您提供可枚举属性的数量。试试getObjectSize(Math)