如何获取对象长度[重复]
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;
【讨论】:
以上是关于如何获取对象长度[重复]的主要内容,如果未能解决你的问题,请参考以下文章