确定一个 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 对象有多少个字段的主要内容,如果未能解决你的问题,请参考以下文章

使用 Integer 包装类创建了多少个对象?

面向对象-02

0136 JavaScript中 arguments 的使用

动态规划--P2758 编辑距离

一个类的对象(使用单/多继承)将有多少个 vptr?

JS基础--作用域及对象解析