如何获取对象长度[重复]

Posted

技术标签:

【中文标题】如何获取对象长度[重复]【英文标题】:How to get object length [duplicate] 【发布时间】:2011-07-28 20:08:07 【问题描述】:

有没有可以返回对象长度的内置函数?

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

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

有一个相关问题 (Length of a JSON object) - 在选择的答案中,用户建议将对象转换为数组,这对我的任务来说不是很舒服。

【问题讨论】:

你为什么不舒服? 建议在该主题中进行转换,并且每个元素都是手动编写的 - 这就是为什么 2 Billy Moon,可能是我没有找到那个话题,因为我用“object”这个词搜索,但是有“associatve array”。对不起 这应该更规范:***.com/questions/126100/… 但有些答案是垃圾。哦,好吧... 【参考方案1】:

也可以这样实现:

Object.entries(obj).length

例如:

let obj =  a: 1, b: 2, ;
console.log(Object.entries(obj).length); //=> 2
// Object.entries(obj) => [ [ 'a', 1 ], [ 'b', 2 ] ]

【讨论】:

这与接受答案的Object.keys(a).length; 解决方案有何不同? 区别是 Object.keys(a) 只给出了对象 a 中存在的键,但 Object.entries(a) 给出了由键和对象 a 中的值组成的数组数组。 我只是提供另一种方法来获得答案。【参考方案2】:

您可能在对象中有未定义的属性。 如果使用Object.keys(data).length 的方法,这些属性也将被计算在内。

您可能希望将它们过滤掉。

Object.keys(data).filter((v) => return data[v] !== undefined).length

【讨论】:

【参考方案3】:

您看过 underscore.js (http://underscorejs.org/docs/underscore.html) 了吗?它是一个具有许多有用方法的实用程序库。有一个集合size 方法,还有一个 toArray 方法,可以得到你需要的。

_.size(one : 1, two : 2, three : 3);
=> 3

【讨论】:

谢谢,我会看看这个库。但实际上,我不想使用很多库(我已经使用了 jQuery 库) @Innuendo 如果您没有注意到,underscore.js 包含我在回答中提到的keys 函数。如果你使用 underscore.js,你可以使用 keys 函数——在这种情况下,现代浏览器将使用内置的 keys 函数,以及 IE8(以及其他没有内置 @987654330 的浏览器) @function) 将使用 underscore.js 定义的自定义函数。 好的。我不喜欢使用很多 .js 文件(可能有点乱),所以我想将 jquery.js 和 underscore.js 合并到文件 '_jquery.js' 中,并将这些库一起使用=) @Innuendo _jquery.js - 我喜欢这个名字:)。但是,我建议使用Google's CDN for jQuery。至于下划线,谷歌的CDN上还没有,但是有demand for it。至于现在,我发现下划线at this CDN - 它托管在亚马逊服务器上,所以它应该是快速和可靠的。 @Innuendo 因为相当多的网站使用谷歌的 jQuery CDN。这意味着当用户请求您的网站时,jQuery 文件可能已经缓存在浏览器中。在这种情况下,浏览器根本不需要请求 jQeury 文件——它使用缓存的文件。如果你想要最新的 1.5 jQuery 文件,你可以从 URL 中删除 .2,它也可以工作。【参考方案4】:

您可以添加另一个名称:长度的值对,并适当地增加/减少它。这样,当您需要查询长度时,您不必每次都遍历整个对象属性,也不必依赖特定的浏览器或库。当然,这完全取决于您的目标。

【讨论】:

【参考方案5】:

还有一个答案:

var j = '["uid":"1","name":"Bingo Boy", "profile_img":"funtimes.jpg","uid":"2","name":"Johnny Apples", "profile_img":"badtime.jpg"]';

obj = Object.keys(j).length;
console.log(obj)

【讨论】:

你重复了接受的答案...... 5 年后。【参考方案6】:

您可以使用 Lodash lib 之类的东西,而 _.toLength(object) 应该会为您提供对象的长度

【讨论】:

【参考方案7】:

对于那些来这里查找已经是 jQuery 对象的东西的项目计数: .length 是您要查找的内容:

例子:

len = $('#divID').length;
alert(len);

【讨论】:

这个问题是关于对象大小,而不是关于 dom 大小【参考方案8】:

总结一下,这里有个通用功能(包括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

【讨论】:

这是一个更好的解决方案 IMO.. 结合了所有其他答案的逻辑.. 如果你没有使用 underscore.js IE8 会为上面的代码抛出一个错误... @Faiz 谢谢老兄,修复了!【参考方案9】:

如果你想避免新的依赖,你可以制作自己的智能对象。当然,只有当你想做更多的事情时才能得到它的大小。

MyNeatObj = function (obj) 
  var length = null;

  this.size = function () 
    if (length === null) 
      length = 0;
      for (var key in obj) length++;
    
    return length;
  


var thingy = new MyNeatObj(originalObj);
thingy.size();

【讨论】:

【参考方案10】:

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

if(!Object.keys)

  Object.keys = function(obj)
  
    return $.map(obj, function(v, k)
    
      return k;
    );
  ;
 

【讨论】:

很想对大括号的位置投反对票... 哈哈...空白和换行免费! 对称对齐语法,赞成。【参考方案11】:

对于支持Object.keys() 的浏览器,您可以这样做:

Object.keys(a).length;

否则(特别是在 IE for (x in y) 循环遍历对象:

var count = 0;
var i;

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

hasOwnProperty 用于确保您只计算对象字面量的属性,而不是它从其原型“继承”的属性。

【讨论】:

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

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

var len = $.map(a, function(n, i)  return i; ).length;

【讨论】:

这仅适用于 jquery 1.6+,如 jQuery.map() 文档中所述:Prior to jQuery 1.6, $.map() supports traversing arrays only. As of jQuery 1.6 it also traverses objects. 这实际上比使用简单的循环和计数器更糟糕,因为回调函数增加了开销。【参考方案13】:

这是影射答案的 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;
        
    
);

可以这样调用:

var cnt = $.keyCount("foo" : "bar"); //cnt = 1;

【讨论】:

【参考方案14】:

应该这样做:

Object.keys(a).length

但是,Object.keys 在 IE8 及更低版本、Opera 和 FF 3.6 及更低版本中不受支持。

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

【讨论】:

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

在 jQuery 中我是这样实现的:

len = function(obj) 
    var L=0;
    $.each(obj, function(i, elem) 
        L++;
    );
    return L;

【讨论】:

以上是关于如何获取对象长度[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在c中获取数组的长度[重复]

如何获取jsonarray中 某个值

如何在java中获取Resultset的长度或大小[重复]

如何获取此处给出的响应对象的长度

获取json对象的长度

我如何获取最新的对象 laravel [重复]