如何获得对象长度

Lar*_*bar 278 javascript json object

是否有任何可以返回对象长度的内置函数?

例如,我a = { 'a':1,'b':2,'c':3 }应该返回3.如果我使用a.length它返回undefined.

它可能是一个简单的循环函数,但我想知道是否有内置函数?

有一个相关的问题(JSON对象的长度) - 在选择的答案中,用户建议将对象转换为数组,这对我的任务来说不太舒服.

Dav*_*ang 540

对于支持Object.keys()的浏览器,您只需执行以下操作:

Object.keys(a).length;
Run Code Online (Sandbox Code Playgroud)

否则(特别是在IE <9中),您可以使用循环自行遍历对象for (x in y):

var count = 0;
var i;

for (i in a) {
    if (a.hasOwnProperty(i)) {
        count++;
    }
}
Run Code Online (Sandbox Code Playgroud)

hasOwnProperty是为了确保您只计算来自对象文字的属性,而不是它从其原型"继承"的属性.

  • 谢谢!顺便说一句,你可以在顶部添加`var i`吗?这伤害了我的眼睛. (44认同)
  • 您还可以在循环中添加"var":for(var i in a){ (14认同)
  • 我想我会分享一个指向Object.keys及其polyfill的链接,如Mozilla所述:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys#Polyfill (3认同)
  • 如果你想让事情更简单(尽管有一些不专业的语法),你可以简单地做`var count = 0,i; for(i in a)if(a.hasOwnProperty(i))count ++;` (2认同)

Šim*_*das 69

这应该这样做:

Object.keys(a).length
Run Code Online (Sandbox Code Playgroud)

但是,Object.keysIE8及以下版本,Opera和FF 3.6及以下版本不支持.

现场演示: http ://jsfiddle.net/simevidas/nN84h/


小智 59

可以轻松完成$.map():

var len = $.map(a, function(n, i) { return i; }).length;
Run Code Online (Sandbox Code Playgroud)

  • 这实际上比使用简单的循环和计数器更糟糕,因为回调函数增加了额外的开销. (4认同)

Phi*_*ger 45

您是否看过underscore.js(http://underscorejs.org/docs/underscore.html)?它是一个包含许多有用方法的实用程序库.有一个收集size方法,以及toArray方法,它可以为您提供所需的.

_.size({one : 1, two : 2, three : 3});
=> 3
Run Code Online (Sandbox Code Playgroud)

  • @Innuendo`_jquery.js` - 我喜欢这个名字`:)`.但是,我建议使用[Google的CDN for jQuery](https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js).至于下划线,它仍然没有在谷歌的CDN上,但有[需求](http://code.google.com/p/google-ajax-apis/issues/detail?id=528).至于现在,我发现下划线[在此CDN](http://ajax.cdnjs.com/ajax/libs/underscore.js/1.1.4/underscore-min.js) - 它托管在亚马逊服务器上,所以它应该快速可靠. (2认同)

tib*_*alt 20

总结一下,这是一个通用功能(包括ie8支持):

var objSize = function(obj) {
    var count = 0;
    
    if (typeof obj == "object") {
    
        if (Object.keys) {
            count = Object.keys(obj).length;
        } else if (window._) {
            count = _.keys(obj).length;
        } else if (window.$) {
            count = $.map(obj, function() { return 1; }).length;
        } else {
            for (var key in obj) if (obj.hasOwnProperty(key)) count++;
        }
        
    }
    
    return count;
};

document.write(objSize({ a: 1, b: 2, c: 3 }));
// 3
Run Code Online (Sandbox Code Playgroud)


Lar*_*bar 10

在jQuery中,我以这样的方式制作它:

len = function(obj) {
    var L=0;
    $.each(obj, function(i, elem) {
        L++;
    });
    return L;
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*ita 7

因此,不必查找和替换Object.keys方法,另一种方法是在脚本执行的早期使用此代码:

if(!Object.keys)
{
  Object.keys = function(obj)
  {
    return $.map(obj, function(v, k)
    {
      return k;
    });
  };
 }
Run Code Online (Sandbox Code Playgroud)

  • 诱惑只为卷曲支架放置而投票... (4认同)

小智 6

也可以这样进行:

Object.entries(obj).length
Run Code Online (Sandbox Code Playgroud)

例如:

let obj = { a: 1, b: 2, };
console.log(Object.entries(obj).length); //=> 2
// Object.entries(obj) => [ [ 'a', 1 ], [ 'b', 2 ] ]
Run Code Online (Sandbox Code Playgroud)


And*_*ank 5

这是Innuendo的答案的jQuery版本,可以使用。

$.extend({
    keyCount : function(o) {
        if(typeof o == "object") {
            var i, count = 0;
            for(i in o) {
                if(o.hasOwnProperty(i)) {
                    count++;
                }
            }
            return count;
        } else {
            return false;
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

可以这样称呼:

var cnt = $.keyCount({"foo" : "bar"}); //cnt = 1;
Run Code Online (Sandbox Code Playgroud)