如何获取对象长度

IT技术 javascript json object
2021-02-03 00:51:12

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

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

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

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

6个回答

对于支持Object.keys() 的浏览器,您可以简单地执行以下操作:

Object.keys(a).length;

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

var count = 0;
var i;

for (i in a) {
    if (a.hasOwnProperty(i)) {
        count++;
    }
}

hasOwnProperty是为了确保您只计算对象文字中的属性,而不是它从其原型“继承”的属性。

如果你想让事情更简单(尽管有些不专业的语法),你可以简单地做 var count=0,i; for (i in a) if (a.hasOwnProperty(i)) count++;
2021-03-19 00:51:12
Object.keys(a).length : IE8 不支持这一点,仍然有大量用户使用 IE8。因此,我不会依赖于此。
2021-03-22 00:51:12
我想我会分享一个指向 Mozilla 所述的 Object.keys 及其 polyfill 的链接:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-27 00:51:12
谢谢!顺便说一句,你能var i在顶部添加吗?它在伤害我的眼睛。
2021-03-28 00:51:12
您还可以在循环中添加“var”: for(var i in a){
2021-04-10 00:51:12

这应该这样做:

Object.keys(a).length

但是,Object.keys在 IE8 及以下、Opera 和 FF 3.6 及以下不支持。

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

如果有人想知道,这是第一个包含的答案Object.keys- @DavidTang几年后只是编辑了他们的答案以包含这个答案。
2021-03-13 00:51:12
是的,我明白了。我们必须忍受到 2016 年(我在开玩笑:)
2021-03-17 00:51:12
@Innuendo 是的,但无论如何这是你想做的事情。IE8 将继续存在几年(至少到 2016 年),并且实现 JavaScript 功能(对于不支持它们的浏览器)是一项微不足道且安全的任务,因此没有理由不这样做. 你不会想因为 IE8 而在接下来的 5 年里避免使用 ES5 的新特性——那是毫无意义的:)
2021-03-21 00:51:12
是的,我也考虑过这个决定,但是我们应该编写自己的 keys() 函数(我的意思是跨浏览器函数)
2021-04-04 00:51:12

可以通过以下方式轻松完成$.map()

var len = $.map(a, function(n, i) { return i; }).length;
由于回调函数的额外开销,这实际上比使用简单的循环和计数器更糟糕。
2021-03-17 00:51:12
这仅适用于 jQuery.map() 文档中所述的 jquery 1.6+: Prior to jQuery 1.6, $.map() supports traversing arrays only. As of jQuery 1.6 it also traverses objects.
2021-03-30 00:51:12

你看过underscore.js ( http://underscorejs.org/docs/underscore.html ) 吗?它是一个实用程序库,有很多有用的方法。有一个集合size方法,以及一个 toArray 方法,它可以满足您的需求。

_.size({one : 1, two : 2, three : 3});
=> 3
谢谢,我会看看这个图书馆。但实际上,我不想使用很多库(我已经使用了 jQuery 库)
2021-03-17 00:51:12
@Innuendo _jquery.js- 我喜欢这个名字:)但是,我建议对 jQuery使用Google 的 CDN至于underscore,目前还没有上Google的CDN,但是有需求至于现在,我在这个 CDN 上发现了下划线——它托管在亚马逊服务器上,所以它应该是快速和可靠的。
2021-03-22 00:51:12
@Innuendo 因为相当多的网站使用谷歌的 jQuery CDN。这意味着当用户请求您的网站时,jQuery 文件可能已经缓存在浏览器中。在这种情况下,浏览器根本不需要请求 jQeury 文件——它使用缓存的文件。如果你想要最新的 1.5 jQuery 文件,你可以.2从 URL 中删除,它也可以工作。
2021-03-22 00:51:12
@Innuendo 如果您没有注意到,underscore.js 包含keys我在回答中提到函数。如果使用 underscore.js,则可以使用该keys函数——在这种情况下,现代浏览器将使用内置keys函数,而 IE8(以及其他没有内置keys函数的浏览器)将使用定义的自定义函数通过 underscore.js。
2021-04-04 00:51:12
行。我不喜欢使用很多 .js 文件(可能有点乱),所以我想将 jquery.js 和 underscore.js 合并到文件 '_jquery.js' 中,然后一起使用这些库=)
2021-04-06 00:51:12

综上所述,这是一个通用功能(包括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

@Faiz 谢谢伙计,修复了!
2021-04-02 00:51:12
这是一个更好的解决方案 IMO .. 结合所有其他答案的逻辑..
2021-04-06 00:51:12
如果你没有使用 underscore.js IE8 会为上面的代码抛出一个错误......
2021-04-06 00:51:12