确定一个 Javascript 对象有多少个字段
Posted
技术标签:
【中文标题】确定一个 Javascript 对象有多少个字段【英文标题】:Determine how many fields a Javascript object has 【发布时间】:2011-03-10 10:14:48 【问题描述】:我有一个 javascript 对象,我试图将其用作“哈希图”。键总是字符串,所以我认为我不需要像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
但这似乎有点古怪和迂回。是否有“正确的方法”来获取对象中的字段数?
【问题讨论】:
对您的方法的唯一建议是添加一个附加参数来排除/包含继承的属性,在这种情况下,您将使用 hasOwnProperty 而不是简单的 for 循环 【参考方案1】: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;
;
用作(example):
var map = new HashMap();
map.put(someKey, someValue);
map.size();
【讨论】:
keys 只返回 Enumerable,hasOwnProperty 键。 "TypeError: Object.keys 不是函数"。我想我应该提到我正在开发一个 Firefox 扩展,所以如果它在 Firefox 中不起作用,那么它对我来说几乎没用。不过,对未来的好信息。谢谢! @Matthew - 是的,这就是为什么我说 在对象上定义 并且是的,可枚举性也很重要,但这也是for..in
将返回的,所以我离开了出讨论。 @MatrixFrog - 它应该出现在 Firefox 4 中,并且您始终可以使用 size 方法定义自定义对象类型,如上例所示。
@Matthew,要获取所有属性,无论是否可枚举,我们现在可以在 ES5 中使用 Object.getOwnPropertyNames
方法。【参考方案2】:
更正:您需要在每次迭代中检查myObject.hasOwnProperty(key)
,因为可以继承属性。例如,如果您在循环Object.prototype.test = 'test'
之前执行此操作,那么test
也将被计算在内。
谈论您的问题:如果速度无关紧要,您可以定义一个辅助函数。毕竟,我们为修剪功能和其他简单的事情定义了助手。很多 javascript 是“一种 hacky 和迂回” :)
更新 失败示例,按要求提供。
Object.prototype.test = 'test';
var x = ;
x['a'] = 1;
x['b'] = 2;
返回的计数为 3。
【讨论】:
使用myObject =
创建对象,然后使用myObject[key] = value
添加属性,其中key
始终是一个字符串。所以我认为在这种情况下这不会是一个问题。
@MatrixFrog 哦,真的吗? :) 'key' 的类型并不重要。我添加了示例来阐明这一点。
顺便说一句,Anurag 在他的回答中强调了同一点(那里的评论)
我不同意使用 hasOwnProperty,仅当您只想要对象本身的道具时才使用它。然而,就我而言,我通常也想计算继承的属性。另外,如果您将 Object 用作 Map,则没有继承的可枚举属性。除非你使用一个简单的库来修改对象的“原型”,在这种情况下你应该知道的更好并且已经遇到过这种情况。【参考方案3】:
这就是你所能做的。显然,JavaScript 对象不是为此而设计的。这只会给你 Enumerable 属性的数量。试试getObjectSize(Math)
。
【讨论】:
【参考方案4】:你也可以只做myObject.length
(在数组中)
没关系,看这个:JavaScript object size
【讨论】:
他问的不是数组,也不是sizeof
。他想要一个对象中的映射(键值对)的数量。
myObject.length
是我的第一个想法,但是是的,它只适用于数组。
顺便说一句,您提供的链接适用于 SIZEOF,例如使用的字节数。 OP 想知道对象中键值对的数量。 (我几乎是 -1,因为这不是问题的答案;但是链接很有趣,即使是在不同的主题上。)以上是关于确定一个 Javascript 对象有多少个字段的主要内容,如果未能解决你的问题,请参考以下文章