javascript 对象中的元素数

Posted

技术标签:

【中文标题】javascript 对象中的元素数【英文标题】:Number of elements in a javascript object 【发布时间】:2010-10-31 16:47:55 【问题描述】:

有没有办法(从某处)获取 量? (即恒定时间复杂度)。

我找不到检索该信息的属性或方法。到目前为止,我只能考虑对整个集合进行迭代,但那是线性时间。 奇怪的是没有直接访问对象的大小,你不这么认为。

编辑: 我说的是Object 对象(不是一般的对象):

var obj = new Object ;

【问题讨论】:

已经在这里回答***.com/questions/126100/…Object.keys(obj).length 【参考方案1】:

数字/长度/维度的概念对于对象来说并没有真正意义,需要它表明你真的想要一个数组。

编辑:向我指出你想要一个 O(1) 。据我所知,恐怕不存在这样的方式。

【讨论】:

他提议自己迭代,这个解决方案就是。他需要一种 O(1) 的方式来实现这一目标...... 你说的很对。真的应该更彻底地阅读问题。 实际上,对象是 JS 中最接近 Map 的东西。地图确实有长度。【参考方案2】:

AFAIK,没有办法可靠地做到这一点,除非你切换到一个数组。老实说,并不看起来很奇怪 - 对我来说,数组是可数的,而对象不是。

可能你会得到的最接近的是这样的

// Monkey patching on purpose to make a point
Object.prototype.length = function()

  var i = 0;
  for ( var p in this ) i++;
  return i;


alert( foo:"bar", bar: "baz".length() ); // alerts 3

但这会产生问题,或者至少会产生问题。所有用户创建的属性都被计算在内,包括 _length 函数本身!虽然在这个简单的示例中,您可以通过使用普通函数来避免它,但这并不意味着您可以阻止其他脚本这样做。所以你会怎么做?忽略函数属性?

Object.prototype.length = function()

  var i = 0;
  for ( var p in this )
  
      if ( 'function' == typeof this[p] ) continue;
      i++;
  
  return i;


alert( foo:"bar", bar: "baz".length() ); // alerts 2

最后,我认为您可能应该放弃使您的对象可数的想法,并找出另一种方法来做您正在做的任何事情。

【讨论】:

鲁滨逊有危险!对 Object 做 NOT 原型!一切都源于 Object,如果您正在做大量的 JS 工作,您将像这样削弱客户端处理。 呃...你没有读过我在评论中写的部分“猴子故意修补以表明观点” - 来吧,我故意这样做是为了人们不会翻转有点关于它。此外,即使我不提倡猴子补丁,如果您认为这会导致性能问题,您会误解原型链在 javascript 中的工作原理video.yahoo.com/watch/111585/1027823 所以..这是做还是不做? 在“Javascript: The Good Parts”中,他使用“create()”方法对对象进行原型设计。我相信这是一本关于 Javascript 的权威书籍。【参考方案3】:

虽然 JS 实现可能会在内部跟踪这样的值,但没有标准的方法来获取它。

过去,Mozilla 的 Javascript 变体暴露了 non-standard __count__,但在 1.8.5 版本中已将其删除。

对于跨浏览器脚本,您必须明确地迭代属性并检查hasOwnProperty()

function countProperties(obj) 
    var count = 0;

    for(var prop in obj) 
        if(obj.hasOwnProperty(prop))
            ++count;
    

    return count;

对于支持 ECMAScript 5 的实现,这也可以写成(感谢Avi Flax)

function countProperties(obj) 
    return Object.keys(obj).length;

请记住,您还会错过不可枚举的属性(例如数组的length)。

如果您使用 jQuery、Prototype、Mootools、$whatever-the-newest-hype 等框架,请检查它们是否带有自己的集合 API,这可能比使用原生 JS 对象更好地解决您的问题.

【讨论】:

该死的,我总是忘记 hasOwnProperty。我告诉你,在 .NET 领域的时间太多了。 +1 jQuery 使用一个对象作为它从查询中获取的集合,并使用长度属性公开该值。 Firefox4 __count__ 不见了:( 有没有办法在没有 for in 的情况下做到这一点?我处于相同类型的绑定中,但如果可能的话,我想让它通过 JSLint。 我们为什么需要hasOwnProperty()【参考方案4】:
function count()
    var c= 0;
    for(var p in this) if(this.hasOwnProperty(p))++c;
    return c;


var O=a: 1, b: 2, c: 3;

count.call(O);

【讨论】:

【参考方案5】:

在任何 ES5 兼容的环境中执行此操作

Object.keys(obj).length

(来自here的浏览器支持) (关于 Object.keys here 的文档,包括可以添加到非 ECMA5 浏览器的方法)

【讨论】:

这不是提出这个答案的正确问题。这样您就可以获取对象的所有键,将它们放入新创建的数组中,然后从该新数组中检索长度属性。 它可能不是编程效率最高的,但它是开发人员效率最高的。 我同意,这绝对是最快(简短,快速完成)的方法。也适用于嵌套对象,如果您只对子对象自己的键感兴趣,Object.keys(obj.nested_obj).length【参考方案6】:

如果你已经在你的构建中使用了 jQuery,只需这样做:

$(yourObject).length

它在对象上非常适合我,而且我已经将 jQuery 作为依赖项。

【讨论】:

奇怪...这对我不起作用。我总是得到 1。ZelkiN 的答案对我有用。 这段代码总是返回 1。只有 1 个对象。它不计算其中的元素 其中一位支持者检查了代码吗?它不起作用并始终返回 1 - 无论 yourObject 包含什么。

以上是关于javascript 对象中的元素数的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript - 对象

Namber函数

Javascript中的arguments数组对象

JavaScript和Java的区别是啥?

DOM 基础事件(鼠标、键盘)

再来复习一下Javascript中关于数组和对象的常用方法