获取Object对象的length

所有JS程序猿(甚至不止JS)都知道,数组(Array)是有length的,通过length属性,可以很方便的获取数组的长度。可以说,只要使用到了数组,就必会使用到其length属性。

而Object对象是没有length属性或方法的,它确实没有存在的必要,因为人们只会在乎该对象能提供什么样的方法,而没有必要知道它到底有多少方法。的确,这确实不是一个普遍性的需求,

因此ECMAScript中也不会为自己增加额外的负担。

我之前一直没有考虑过这个问题,我们通过CGI获取数据,对于一条一条的数据,后台将其做成数组并以json返回。如下所示:

try{callback({
     data:[{a:1},{a:2}]
     });
}catch(e){}

这是非常合理的,因为我在前端可以用length得到数据的长度,并逐条将其插入表格,或者是通过其他的方式表现出来。但是你永远也不能用一成不变的思维方式来解决所有问题。

某天写后台接口的同事决定换一种数据格式,改用object来表示数据,并为每个数据添加一个索引,如下所示:

1 try{callback({
2     data:{1:{a:1},2:{a:2}}
3     });
4 }catch(e){}

面对这样的数据,我就犯愁了,因为object不能获取对象长度。当然我可以叫后台同事改一下接口返回的格式,但是既然他可以写出以这样格式返回的代码,那其他的后台同事也同样

可以写出。为了不影响到更多的人,就需要我在前端来做处理了。其实要获取对象的长度也不难,用for in 语句就能实现,如下代码所示:

 var a = {a:1,b:2,c:3,d:4};
 function length(obj) {
     var count = 0;
     for(var i in obj){
         count ++;
     }
     return count;
 };
 alert(length(a));    //5

至于为什么是5而不是4那是因为每个对象都有一个内部属性(__proto__指向原型)。

为了更方便的使用这个方法,可以把它写到Object原型里面去,并且不去计算它的原型长度,如下代码所示:

 var a = {a:1,b:2,c:3,d:4};
 Object.prototype.length = function() {
   var count = 0;
    for(var i in obj){
        if(obj.hasOwnProperty(i)){//如果包含除它的原型本身之外的属性
            count++;
        };
    };
    return count;   

 };
 alert(a.length());    //5

这样用起来会更直观,跟接近Array的使用习惯。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户画像

JAVA反射机制

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对...

551
来自专栏Fundebug

Async/Await替代Promise的6个理由

译者按: Node.js的异步编程方式有效提高了应用性能;然而回调地狱却让人望而生畏,Promise让我们告别回调函数,写出更优雅的异步代码;在实践过程中,却发...

764
来自专栏HTML5学堂

2015.12.03 HTML5真题练习

HTML5学堂:每天一道题,强壮程序员!今日主要涉及昨日题目的解答,以及一道涉及计时器、时间对象的题目。 HTML5真题【2015.12.02】答案解析 昨日真...

3195
来自专栏Seebug漏洞平台

CVE-2017-5123 漏洞利用全攻略

原文:https://salls.github.io/Linux-Kernel-CVE-2017-5123/ 译者:hello1900@知道创宇404实验室...

3217
来自专栏用户2442861的专栏

基于protobuf的RPC实现

http://blog.csdn.net/kevinlynx/article/details/39379957

643
来自专栏梧雨北辰的开发录

iOS面试知识总结之功能区分

凡经历过iOS面试的我们总会发觉,即使实际开发中做过许多项目,也难免为一个普通的面试题受挫。这也许不是因为我们技术不过关,而是因为在平时我们忽略了怎样将用到的知...

3055
来自专栏程序员与猫

CLR和.Net对象生存周期

标签:GC .Net C# CLR 前言 对象的生存周期和垃圾回收一直是容易被我们忽略的知识点,因为我们现在高级语言编程平台太“智能”了,自动的异常处理,内存管...

1945
来自专栏更流畅、简洁的软件开发方式

实体类的变形【2】—— 行列转换

    上次说了一下在网页里面显示列表数据的情况,这个应用范围太小了,添加、修改怎么办呢?网站的后台管理、OA、CRM等怎么办?还是这样处理显然是不行的。...

2179
来自专栏数据结构与算法

pd_ds中的hash

前言 在c++的STL中,提供了一种hash函数,其用法和map是几乎一样的,但是速度却能快接近一倍 使用方法 需要的头文件 #include<ext/pb_d...

3239
来自专栏阮一峰的网络日志

Javascript编程风格

Douglas Crockford是Javascript权威,Json格式就是他的发明。 去年11月他有一个演讲(Youtube),谈到了好的Javascrip...

3196

扫码关注云+社区