确定Javascript对象具有多少字段

确定Javascript对象具有多少字段,javascript,map,size,Javascript,Map,Size,我有一个Javascript对象,我正试图将其用作“hashmap”。键总是字符串,所以我不需要像中描述的那样复杂的东西。(我也不希望键的数量超过10个左右,所以我并不特别关心查找是O(n)还是O(logn)等等。) 我想要的内置Javascript对象似乎没有的唯一功能是快速计算对象中键/值对的数量,比如Java返回的内容。当然,你可以这样做: function getObjectSize(myObject) { var count=0 for (var key in myObject

我有一个Javascript对象,我正试图将其用作“hashmap”。键总是字符串,所以我不需要像中描述的那样复杂的东西。(我也不希望键的数量超过10个左右,所以我并不特别关心查找是O(n)还是O(logn)等等。)

我想要的内置Javascript对象似乎没有的唯一功能是快速计算对象中键/值对的数量,比如Java返回的内容。当然,你可以这样做:

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

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

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


没关系,看看这个:

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

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

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

更新
故障示例,如请求所示

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

返回的计数将为3。

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

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

Object.keys({a: 1, b: 2}).length; // 2
请注意,在JavaScript中,所有对象基本上都是键/值对,并且它们也非常可扩展。您可以使用
size
方法扩展
Object.prototype
,并在那里获得计数。但是,更好的解决方案是创建一个
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;
};
使用as():


他不是在问数组,也不是在问
sizeof
。他想要一个对象中映射(键值对)的数量。
myObject.length
是我的第一个想法,但是是的,它只适用于数组。顺便说一句,您给出的链接是针对SIZEOF的,例如使用的字节数。OP想知道对象中键值对的数量。(我几乎做到了-1,因为这不是问题的答案;但是链接很有趣,即使是在不同的主题上。)keys只返回可枚举的hasOwnProperty键。“TypeError:Object.keys不是函数”。我想我应该提到我正在开发一个Firefox扩展,所以如果它在Firefox中不起作用,那么它对我来说几乎毫无用处。不过,未来的信息还是不错的。谢谢@Matthew-是的,这就是为什么我说在对象上定义,是的,可枚举性也很重要,但这就是
for..in
也将返回的内容,所以我将其排除在讨论之外@MatrixFrog-它应该出现在Firefox 4中,您可以始终使用size方法定义自定义对象类型,如上例所示。@Matthew,为了获得所有属性,无论是否可枚举,我们现在可以在ES5中使用该方法。该对象是使用
myObject={}
创建的,然后使用
myObject[key]将属性添加到该对象中=值,其中
键始终是字符串。所以我认为在这种情况下这不会是一个问题。@matrixprog哦,真的吗?:)“键”是什么类型并不重要。顺便说一句,Anurag在他的回答中也强调了同样的观点(这里的评论)。我不同意使用hasOwnProperty,如果你只想在对象本身上使用道具,就使用它。然而,在我的例子中,我通常也要计算继承的属性。另外,如果将对象用作映射,则没有继承的可枚举属性。除非您使用一个简单的库来修改对象的“原型”,否则在这种情况下,您应该更清楚并且已经遇到了这个问题。对您的方法的唯一建议是添加一个额外的参数来排除/包括继承的属性,在这种情况下,您将使用hasOwnProperty而不仅仅是简单的for循环
var map = new HashMap();
map.put(someKey, someValue);
map.size();