我有一个像这样的对象:
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
这对我来说有点棘手。希望你们能帮忙。
执行此操作的最简单方法是包含 Lo-Dash,并具有出色的性能和与新旧浏览器的兼容性。或 Underscore在您的页面中。
然后您可以使用 _.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在他的回答中。