是否有可以返回对象长度的内置函数?
例如,我a = { 'a':1,'b':2,'c':3 }
应返回3
。如果我使用a.length
,则返回undefined
。
它可能是一个简单的循环函数,但我想知道是否有内置函数?
有一个相关的问题(Length of a JSON object) - 在选择的答案中,用户建议将对象转换为数组,这对我的任务来说不太舒服。
答案 0 :(得分:529)
对于支持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
用于确保您只计算来自对象文字的属性,而不是它从其原型“继承”的属性。
答案 1 :(得分:66)
这应该这样做:
Object.keys(a).length
但是,IE8及以下版本,Opera及FF 3.6及以下版本不支持Object.keys
。
答案 2 :(得分:59)
可以使用$.map()
轻松完成:
var len = $.map(a, function(n, i) { return i; }).length;
答案 3 :(得分:45)
您是否看过 underscore.js (http://underscorejs.org/docs/underscore.html)?它是一个包含许多有用方法的实用程序库。有一个集合size
方法,以及一个toArray方法,它可以为您提供所需的。
_.size({one : 1, two : 2, three : 3});
=> 3
答案 4 :(得分: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

答案 5 :(得分:10)
在jQuery中,我以这样的方式做到了:
len = function(obj) {
var L=0;
$.each(obj, function(i, elem) {
L++;
});
return L;
}
答案 6 :(得分:7)
因此,不必查找和替换Object.keys方法,另一种方法是在执行脚本的早期代码:
if(!Object.keys)
{
Object.keys = function(obj)
{
return $.map(obj, function(v, k)
{
return k;
});
};
}
答案 7 :(得分:5)
这是Innuendo的答案的jQuery-ised函数,可以随时使用。
$.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;
答案 8 :(得分:3)
还有一个答案:
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)

答案 9 :(得分:2)
对于那些来这里找到已经是 jQuery对象的项目数量的人:
.length正是你要找的:
示例:
len = $('#divID').length;
alert(len);
答案 10 :(得分:1)
如果您想避免新的依赖关系,您可以制作自己的智能对象。当然,只有当你想做更多才能达到它的大小时。
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();
答案 11 :(得分:0)
您可能在对象中有一个未定义的属性。
如果使用Object.keys(data).length
的方法,则还会计算这些属性。
您可能希望将其过滤掉。
Object.keys(data).filter((v) => {return data[v] !== undefined}).length
答案 12 :(得分:0)
也可以通过以下方式完成:
Object.entries(obj).length
例如:
let obj = { a: 1, b: 2, };
console.log(Object.entries(obj).length); //=> 2
// Object.entries(obj) => [ [ 'a', 1 ], [ 'b', 2 ] ]
答案 13 :(得分:-1)
您可以添加另一个名称:长度值对,并适当增加/减少它。这样,当您需要查询长度时,您不必每次都遍历整个对象属性,并且您不必依赖特定的浏览器或库。当然,这完全取决于你的目标。
答案 14 :(得分:-2)
您可以使用类似Lodash lib和_.toLength(对象)之类的内容来为您提供对象的长度