Javascript 如何获取对象长度

Javascript 如何获取对象长度,javascript,json,object,Javascript,Json,Object,是否有任何内置函数可以返回对象的长度 例如,我有a={'a':1,'b':2,'c':3},它应该返回3。如果我使用a.length它将返回undefined 它可以是一个简单的循环函数,但我想知道是否有内置函数 有一个相关的问题()-在选择的答案中,用户建议将对象转换为数组,这对于我的任务来说不是很舒服。对于支持的浏览器,您可以简单地执行以下操作: Object.keys(a).length; 否则(特别是在IE

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

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

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

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

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

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;
}

你看过下划线.js()了吗?这是一个实用程序库,有很多有用的方法。有一个collection
size
方法,还有一个toArray方法,可以满足您的需要

_.size({one : 1, two : 2, three : 3});
=> 3
这应该做到:

Object.keys(a).length
但是,IE8及以下版本、Opera及FF 3.6及以下版本不支持对象.key


现场演示:

这里有一个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;
可通过以下方式轻松完成:


因此,不必查找并替换Object.keys方法,另一种方法是在脚本执行的早期编写以下代码:

if(!Object.keys)
{
  Object.keys = function(obj)
  {
    return $.map(obj, function(v, k)
    {
      return k;
    });
  };
 }

如果要避免新的依赖项,可以创建自己的智能对象。当然,只有当你想做更多的事情时,你才能得到它的尺寸

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();

总而言之,这里有一个通用功能(包括ie8支持):

var objSize=函数(obj){
var计数=0;
if(对象类型==“对象”){
if(Object.keys){
count=Object.keys(obj).length;
}否则,如果(窗口){
计数=uj.keys(obj.length);
}else if(窗口$){
count=$.map(obj,function(){return 1;}).length;
}否则{
for(obj中的var键)if(obj.hasOwnProperty(键))count++;
}
}
返回计数;
};
编写(objSize({a:1,b:2,c:3}));

//3
对于那些来到这里查找已经是jQuery对象的项目计数的人:
.长度是您需要的:

例如:

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

您可以使用lib和uz之类的工具。toLength(对象)应该会给您对象的长度

再回答一个问题:

var j='[{“uid”:“1”,“name”:“Bingo Boy”,“profile_img”:“funtimes.jpg”},{“uid”:“2”,“name”:“Johnny Apples”,“profile_img”:“badtime.jpg”}];
obj=对象。键(j)。长度;

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

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

你可能想把它们过滤掉

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

也可以通过以下方式完成:

Object.entries(obj).length

例如:

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

为什么对你来说不舒服?在这个主题中,建议进行转换,并且每个元素都是手动编写的-这就是为什么2 Billy Moon,可能是因为我没有找到那个主题,因为我用“object”这个词搜索,但是有“Associateve array”。对不起,这应该更规范一些:但有些答案是垃圾。哦,嗯……是的,我也考虑过这个决定,但是我们应该编写自己的keys()函数(我的意思是crossbrowser函数)@inneudo是的,但这是你无论如何都想做的事情。IE8还将持续几年(至少到2016年),而实现JavaScript功能(针对不支持它们的浏览器)是一项琐碎而安全的任务,因此没有理由不这么做。你不会仅仅因为IE8就想在未来5年内避免使用新的ES5功能-那是毫无意义的
:)
是的,我明白了。我们必须忍受到2016年(我是开玩笑的
:)
)如果有人想知道,这是第一个包含
Object.keys
-@DavidTang的答案,仅仅几年后就包含了这个答案。谢谢,我会看看这个库。但实际上,我不想使用很多库(我已经使用了jQuery库)@inuendo如果您没有注意到,下划线.js包含我在回答中提到的
keys
函数。如果使用underline.js,您可以使用
功能-在这种情况下,现代浏览器将使用内置的
功能,IE8(以及其他没有内置
功能的浏览器)将使用underline.js.Ok定义的自定义功能。我不喜欢使用很多.js文件(可能有点凌乱),因此我想将jquery.js和下划线.js合并到文件“\u jquery.js”中,并将这些库一起使用
=)
@inneudo
\u jquery.js
-我喜欢这个名称
:)
。但是,我建议使用。至于下划线,它还没有出现在谷歌的CDN上,但有。就目前而言,我发现下划线-它托管在亚马逊服务器上,因此应该快速可靠。@inuendo,因为相当多的网站使用Google的CDN for jQuery。这意味着当用户请求您的网站时,jQuery文件可能已经缓存在浏览器中。在这种情况下,浏览器根本不需要请求jQeury文件——它使用缓存的文件。如果您想要最新的1.5 jQuery文件,只需从URL中删除
.2
,它也会起作用。这仅适用于
let obj = { a: 1, b: 2, };
console.log(Object.entries(obj).length); //=> 2
// Object.entries(obj) => [ [ 'a', 1 ], [ 'b', 2 ] ]