是否有任何内置函数可以返回对象的长度?
例如,我有a = {'a':1,'b':2,'c':3},它应该返回3。如果我使用。length,它返回undefined。
它可以是一个简单的循环函数,但我想知道是否有内置函数?
还有一个相关的问题(JSON对象的长度)——在选择的答案中,用户建议将对象转换为数组,这对我的任务来说不是很舒服。
是否有任何内置函数可以返回对象的长度?
例如,我有a = {'a':1,'b':2,'c':3},它应该返回3。如果我使用。length,它返回undefined。
它可以是一个简单的循环函数,但我想知道是否有内置函数?
还有一个相关的问题(JSON对象的长度)——在选择的答案中,用户建议将对象转换为数组,这对我的任务来说不是很舒服。
当前回答
下面是一个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;
其他回答
所以我们不需要去寻找和替换对象。方法,另一种方法是在脚本执行的早期执行以下代码:
if(!Object.keys)
{
Object.keys = function(obj)
{
return $.map(obj, function(v, k)
{
return k;
});
};
}
对于支持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的存在是为了确保你只计算来自对象字面量的属性,而不是它从原型“继承”的属性。
在jQuery中,我已经这样做了:
len = function(obj) {
var L=0;
$.each(obj, function(i, elem) {
L++;
});
return L;
}
如果你想避免新的依赖,你可以创建自己的智能对象。当然,只有当你想做更多的事情时,才会得到它的大小。
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();
您可以添加另一个名称:length值对,并适当地递增/递减它。这样,当需要查询长度时,就不必每次都遍历整个对象属性,也不必依赖于特定的浏览器或库。当然,这完全取决于你的目标。