JavaScript 计算对象中的对象数量

109

我有一个类似于以下的对象:

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

这对我来说有点棘手。希望你们能帮忙。


1
请问您能否发布完整的对象? - Zain Shaikh
1
你为什么要这样使用对象?对于你的问题有很多事情需要考虑 - 你需要了解属性是什么,哪些是可枚举的,原型如何增加混乱等等。为什么不只使用数组呢? - Sacho
尽管此问题被标记为重复,但这里的接受答案对我来说比第一个问题中给出的解决方案更容易实现。 - Anshu Prateek
3个回答

141

最简单的方法是在您的页面中包含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测试页面,用于比较这些不同方法的速度。请在任何可用的浏览器中运行它以添加到测试中。

感谢Barmar在他的答案中推荐新浏览器使用Object.keys


1
这是一种相当常见的方法,但也可以使用if语句轻松完成相同的操作。主要的事情是在函数外部而不是内部执行它。 - Michael Geary
谢谢Michael,这有点复杂,但我想我会研究一下。 - Bryan Learn
1
我尝试了 Object.keys(obj.Data) ,它返回了 0、1、2,我该如何获取总数或者它是否以这种格式返回? - Bryan Learn
1
Bryan,调用ObjectLength(obj.Data) - Michael Geary
1
你也可以使用values(object).length - Panayiotis Georgiou
显示剩余9条评论

114

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

Object.keys(obj.Data).length

请查看MDN

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


嗨Barmar,不知怎么的它没有在控制台下记录...你能帮我解释一下吗? - Bryan Learn
keys不是要被计算的对象的属性。@BryanLearn:他的意思是Object.keys(obj.Data).length。无论如何都应该被关闭为重复问题 :-) - Bergi
对我来说,这就是答案。添加像lodash这样的库不是解决方案的一部分。此外,您不能依赖于for in循环以按预期顺序输出。 - Ben Racicot
更好的答案。 - Manachi
如果你只关心长度,为什么顺序很重要? - Barmar
显示剩余3条评论

41

7
你最好给其他答案点赞,而不是重新发布解决方案 :-) - Bergi
7
当我开始制作演示时,没有人给出过这个答案。 - Sudarshan Tanwar
1
@Bergi。在评论之前,您应该查看时间戳。有时有更好的答案存在,但没有人关心。 - ibnɘꟻ
@FendiSetiawan 看时间戳,这些是关于一个已关闭问题的7年前的评论?(即使那时候,Barmar的答案也比这个早发布和编辑) - Bergi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接