获取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而不是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());    //
这样用起来会更直观,跟接近Array的使用习惯。
获取Object对象的length的更多相关文章
- 获取Object对象属性的方法,Reflect.ownKeys, Object.getOwnPropertyNames,Object.getOwnPropertySymbols,Object.keys,for in
		let triangle={ a:1, b:2, c:3 } function coloTriangle(){ this.color='red'; } coloTriangle.prototype=t ... 
- js获取textaera对象(object)的值
		for(i in pstrWord ){ alert(i); //获得属性 alert(pstrWord[i]); //获得属性值 } 1.js输出object对象方法如下: function wri ... 
- jquery ajax获取json并解析,获取的json是object对象格式
		首先我们使用的是ajax方式,推荐一个学习网址: http://blog.csdn.net/shiyaru1314/article/details/51065410 这个博主写的特别好.现在来看我们的 ... 
- 原生JS:Object对象详细参考
		Object对象详细参考 本文参考MDN做的详细整理,方便大家参考MDN JavaScript原生提供一个Object对象(注意起首的O是大写),所有其他对象都继承自这个对象. 构造函数: Objec ... 
- javascript ES5 Object对象
		原文:http://javascript.ruanyifeng.com/stdlib/object.html 目录 概述 Object对象的方法 Object() Object.keys(),Obje ... 
- C# for AUTOCAD ActiveX获取图形对象坐标程序
		C# for AUTOCAD ActiveX获取图形对象坐标程序 using System;using System.Collections.Generic;using System.Componen ... 
- JavaScript---网络编程(6)-Dom和Bom模型概念讲解(节点获取,window对象)
		本节讲Dom和Bom模型概念讲解(节点获取,window对象). out.js: 写了2个输出到页面的函数. function println(param){ document.write(param ... 
- 详解JavaScript中的Object对象
		Object是在javascript中一个被我们经常使用的类型,而且JS中的所有对象都是继承自Object对象的.虽说我们平时只是简单地使用了Object对象来存储数据,并没有使用到太多其他功能,但是 ... 
- 获取json对象长度
		JSON对象变化万千,非常灵活,对应的获取方法分别为: 1.最简单类型的(myObject是对象,不是字符串哦) <script type="text/javascript" ... 
随机推荐
- bzoj 4539: [Hnoi2016]树
			Description 小A想做一棵很大的树,但是他手上的材料有限,只好用点小技巧了.开始,小A只有一棵结点数为N的树,结 点的编号为1,2,-,N,其中结点1为根:我们称这颗树为模板树.小A决定通过 ... 
- Docker(八):Docker端口映射
			1.随机映射 docker run -P -d --name mynginx1 nginx [root@node1 ~]# docker ps -l CONTAINER ID IMAGE COMMAN ... 
- JMeter 插件管理
			JMeter管理的插件包括了jmeter-plugins.org上常用的插件以及各种第三方插件和JMeter核心插件. JMeter插件管理器主要管理插件安装,卸载,升级等操作. 安装插件管理 1.下 ... 
- badboy 录制脚本并并发脚本
			很久没有研究过接口相关的工具了,一个偶然的机会听说了 badboy,可以录制jemter脚本, 查了资料 还可以并发,于是乎,实践才知道. http://www.badboy.com.au/ 官网,我 ... 
- javamelody 使用
			javamelody 扩展API如何获取监控参数 https://github.com/javamelody/javamelody/wiki/ExternalAPI#json 
- 数据库和 MySQL 简介(真的只是简介)
			数据库 si 什么? google.com baidu.com 数据库服务器,数据管理系统,数据库,表与记录的关系 
- Vue 子组件无法使用 $emit 向父组件传参
			问题描述: 
- (python)leetcode刷题笔记03 Longest Substring Without Repeating Characters
			3. Longest Substring Without Repeating Characters Given a string, find the length of the longest sub ... 
- .NET Core+MySql+Nginx 容器化部署
			.NET Core容器化@Docker .NET Core容器化之多容器应用部署@Docker-Compose .NET Core+MySql+Nginx 容器化部署 GitHub-Demo:Dock ... 
- windows系统下使用cd命令
			如果要切换到D:\Program Files目录下,大多数人会想当然的在命令行窗口输入 cd D:\Program Files回车. 如下所示: 发现并没有切换到D:\Program Files. 正 ... 
