99

我有一个类似的对象:

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

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

4

3 回答 3

133

要做到这一点,最简单的方法是在您的页面中包含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使用更新的浏览器。

于 2013-06-07T05:37:53.853 回答
98

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

Object.keys(obj.Data).length

MDN

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

于 2013-06-07T05:38:56.577 回答
37

在这里尝试演示

var list ={}; var count= Object.keys(list).length;
于 2013-06-07T06:08:20.507 回答