我有一个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和迂回。是否有“正确的方法”来获取对象中的字段数?
答案 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)
。