【问题标题】:Javascript counting number of objects in object [duplicate]Javascript计算对象中的对象数[重复]
【发布时间】:2013-06-03 08:03:38
【问题描述】:

我有一个类似的对象:

Object {0=Object, 1=Object, 2=Object} // Output from console.log(obj.Data);

但是我没有办法统计对象中的对象数量,然后最终从子对象中获取属性值。

我试过了

console.log(obj.Data[0].length); // It does not work

console.log(obj.Data.length); // It does not work

这对我来说有点棘手。希望大家能帮忙。

【问题讨论】:

  • 能否请您发布完整的对象?
  • 为什么要这样使用对象?你的问题需要考虑很多事情——你需要了解什么是属性,哪些是可枚举的,原型如何在这里增加混乱,等等。为什么不直接使用数组?
  • 即使这个 q 被标记为重复,这里接受的答案对我来说比第一个问题中给出的解决方案更容易。

标签: javascript object count


【解决方案1】:

要做到这一点,最简单的方法是在您的页面中包含 Lo-DashUnderscore,它具有出色的性能和与新旧浏览器的兼容性。

那么您可以使用_.size(object)_.keys(object).length

对于您的obj.Data,您可以使用以下方法进行测试:

console.log( _.size(obj.Data) );

或:

console.log( _.keys(obj.Data).length );

Lo-Dash 和 Underscore 都是优秀的库;您会发现代码中的任何一个都非常有用。 (它们彼此非常相似;Lo-Dash 是具有一些优势的较新版本。)

或者,您可以在代码中包含此函数,它只是循环遍历对象的属性并对其进行计数:

function ObjectLength( object ) {
    var length = 0;
    for( var key in object ) {
        if( object.hasOwnProperty(key) ) {
            ++length;
        }
    }
    return length;
};

您可以使用以下方法进行测试:

console.log( ObjectLength(obj.Data) );

不过,该代码的速度不如现代浏览器中的那么快。对于在现代浏览器中速度更快且在旧浏览器中仍然有效的版本,您可以使用:

function ObjectLength_Modern( object ) {
    return Object.keys(object).length;
}

function ObjectLength_Legacy( object ) {
    var length = 0;
    for( var key in object ) {
        if( object.hasOwnProperty(key) ) {
            ++length;
        }
    }
    return length;
}

var ObjectLength =
    Object.keys ? ObjectLength_Modern : ObjectLength_Legacy;

和以前一样,使用以下命令对其进行测试:

console.log( ObjectLength(obj.Data) );

此代码在现代浏览器中使用Object.keys(object).length,并回退到在旧浏览器中循环计数。

但如果您要完成所有这些工作,我建议您改用 Lo-Dash 或 Underscore 并获得这些库提供的所有好处。

我设置了jsPerf that compares the speed of these various approaches。请在您方便添加到测试的任何浏览器中运行它。

感谢Barmar suggesting Object.keys for newer browsers 在他的回答中。

【讨论】:

  • 使用条件运算符进行这种特征检测似乎过于复杂。
  • 嗨,你能解释一下吗?我可以将它放入一个函数中并在需要时调用它吗?为了给使用旧版浏览器的用户安全起见,我会尽量采用这个。
  • 这是一种很常见的方法,但很公平,您可以使用 if 语句轻松地做同样的事情。主要是在函数之外而不是在函数内部进行。
  • @BryanLearn - 这一个函数。省略console.log() 调用和结束,您可以按原样使用它。 console.log() 调用说明了如何调用它。
  • 你也可以values(object).length
【解决方案2】:

在最近的浏览器中你可以使用:

Object.keys(obj.Data).length

MDN

对于较旧的浏览器,请在 Michael Geary 的回答中使用 for-in 循环。

【讨论】:

  • 嗨,Barmar,不知何故,它没有在控制台下登录...你能帮我解释一下吗?
  • keys 不是要计数的对象的属性。 @BryanLearn:他的意思是Object.keys(obj.Data).length。无论如何都应该作为骗子关闭:-)
  • 对我来说这就是答案。添加像 lodash 这样的库不是解决方案的一部分。此外,您不能依赖 for in 循环以预期顺序输出。
  • 更好的答案。
  • @BenRacicot 如果您只关心长度,为什么顺序很重要?
【解决方案3】:

试试Demo Here

var list ={}; var count= Object.keys(list).length;

【讨论】:

  • 您宁愿支持其他答案,而不是重新发布解决方案 :-)
  • 当我开始做demo的时候,没有人给出这个答案。
  • @Bergi 。您应该在 cmets 之前查看时间戳。有时会有更好的答案,但没人在乎。
  • @FendiSetiawan 看看时间戳,这些是 7 岁的 cmets 在一个封闭的问题上? (即便如此,Barmar 的答案确实比这更早发布和编辑)
猜你喜欢
  • 2014-02-24
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 2018-09-15
  • 2017-12-28
  • 2016-01-10
  • 2021-07-06
  • 2012-05-19
相关资源
最近更新 更多