确定Javascript对象有多少个字段

Mat*_*rog 11 javascript size map

我有一个Javascript对象,我试图用作"hashmap".键总是字符串,所以我认为我不需要像SO问题中描述的那样复杂的东西.(我也不希望密钥的数量超过10,所以我并不特别关注查找是O(n)与O(log n)等.)

我想要的内置Javascript对象似乎没有的唯一功能,是一种快速的方法来计算对象中的键/值对的数量,就像Java的Map.size返回的那样.当然,你可以这样做:

function getObjectSize(myObject) {
  var count=0
  for (var key in myObject)
    count++
  return count
}
Run Code Online (Sandbox Code Playgroud)

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

Anu*_*rag 14

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

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

Object.keys({a: 1, b: 2}).length; // 2
Run Code Online (Sandbox Code Playgroud)

请注意,所有对象基本上都是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;
};
Run Code Online (Sandbox Code Playgroud)

用作(例子):

var map = new HashMap();
map.put(someKey, someValue);
map.size();
Run Code Online (Sandbox Code Playgroud)


Nik*_*bak 3

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

并谈论您的问题:如果速度不重要,您可以定义一个辅助函数。毕竟,我们为修剪函数和其他简单的事情定义了助手。很多 javascript 都是“有点 hacky 和迂回”:)


根据要求更新失败示例。

Object.prototype.test = 'test';
var x = {};
x['a'] = 1;
x['b'] = 2;
Run Code Online (Sandbox Code Playgroud)

返回的计数将为 3。