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 对象中的元素数的主要内容,如果未能解决你的问题,请参考以下文章