最近写js时碰到了当数组key不为数字时,获取数组的长度为0 的情况。

1、问题场景

var arr = new Array();
arr[‘s1‘] = 1001;
console.log(arr.length);

通过chrome查看:

2、原因分析

js Array只支持数字索引,若指定的key为非数字索引,那么length为0.

另外,若key为数字索引,length的长度是根据key值得出的,比如一个数组a中key最大值为1000,value为1000,那么a的长度就是1001.只有a[1000] = 1000.从a[0]到a[999]的值为undefined

可以来验证一下:

    var arr = new Array();
    arr[1000] = 1001;
    console.log(arr.length);

3、解决长度问题

出现问题的原因已经知道了,有的时候我们需要设置的key不是数字索引,而是非数字索引,那么如何获取长度呢。我们可以把Array看成是特殊的Object类型。有两种方式可以得到Object类型的长度:

第一种方法:通过 Object.keys(obj).length 获取。

可以验证下:

    var obj = new Object();
    obj[1001] = 1001;
    obj[1002] = 1002;
    console.log(obj.length);
    console.log(Object.keys(obj).length);

该方法获取长度是会获取到原型的属性的,如果一个对象继承了另一个对象,或者在原型中设置了属性,要想获取对象的本身的属性时,这个方法是不靠谱的。

因此,第二个方法就是过滤到原型的属性:

调用:var length = getPropertyCount(obj);

由于任何一个Object对象都有方法 hasOwnProperty,当属性为原型定义的属性,hasOwnProperty返回true。

 function getPropertyCount(o){
var n, count = 0;
for(n in o){
if(o.hasOwnProperty(n)){
count++;
}
}
return count;
}

问题到这里应该可以解决了,现在想要获取一个数组的实际指定的长度,一般来说,我们不会为Array的原型添加额外的属性,所以,我们可以通过采用上面的第一种方式解决。

可以验证下:

题外话:

判断一个属性是否是共享属性,可以通过hasOwnProperty 及in 联合判断。

hasOwnProperty:当对象存在属性且属性不是共享的,返回true

in:当对象中存在属性,返回true.

因此,如判断person中是否存在私有属性属性a,person.hasOwnPropety(a) && a in person 需返回true

判断person中是否存在共享属性属性a, !person.hasOwnProperty(a) && a in person 需返回true
 
 
 
 
 
 
 
原文:http://www.cnblogs.com/wmmang-blog/p/4067143.html

解决js array的key不为数字时获取长度的问题的更多相关文章

  1. JSON的key值为数字时如何使用

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript(Standard ECMA-262 ...

  2. js控制 input框中输入数字时,累计求和

    $('.cc input').bind('input propertychange', function(){ var total = 0; $("input").each(fun ...

  3. js input框限制输入为数字并限制长度

    <input type="number" name="price" id="priceVal" placeholder="请 ...

  4. js解析php返回的json数据无法获取length的问题分析

    1.问题出现的过程,js解析php json_encode 的数据,无法获取长度信息,提示undefined   debug:       首先打印查看了php encode后的数据,返现最外层是一个 ...

  5. 一行代码解决JS数字大于2^53精度错误的问题

    服务端使用长整型(Int64)的数字,在浏览器端使用JS的number类型接收时,当这个实际值超过 (2^53-1)时,JS变量的值和实际值就会出现不相等的问题.常见场景比如使用雪花算法生成Id. 在 ...

  6. js:Array对象常用方法介绍

    前言 在js中,数组作为一个特殊的对象.是我们常用的数据格式.今天就来梳理一下常用的数组方法. 1.基础 几种基础的就简单介绍一下:创建数组 var arr1 = new Array(); //括号可 ...

  7. 【转】js 中导出excel 较长数字串会变为科学计数法

    [转]js 中导出excel 较长数字串会变成科学计数法 在做项目中,碰到如题的问题.比如要将居民的信息导出到excel中,居民的身份证号码因为长度过长(大于10位),excel会自动的将过长的数字串 ...

  8. Gson如何解析key值是数字的json数据

    1.使用注解@SerializedName来解决这个问题 2.比如有如下json数据:(key值是数字"1112") { "1112": "抖音&qu ...

  9. js Array操作

    JS中数组的操作 1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长 ...

随机推荐

  1. [GO]并的爬取捧腹的段子

    package main import ( "fmt" "strconv" "net/http" "regexp" &q ...

  2. Actor模型文章收集

    参与者模式——维基百科 Akka.Net——github开源项目 Actor原理——比较深入的文章

  3. ettercap dns_spoof

    首先编辑网页,打开apache2服务器,编辑好etter.dns 然后开始ettercap -G 的操作 sniff选择好自己使用的网卡 scan hosts ,扫描完将目标和网关添加到目标一目标二 ...

  4. android多lib库工程的自动批量构建--编写ant脚本

    基本配置--build.properties 首先编写基本配置build.properties ,主要配置如下: android sdk所在目录 编译项目所使用的项目版本 Jdk所在目录 以及签名时, ...

  5. c_c++基础问题(平时读书时笔记)

    1 IP私有地址: 10.0.0.0 -- 10.255.255.255 172.16.0.0 -- 172.31.255.255 192.168.0.0 -- 192.168.255.255 2OS ...

  6. shiro注解@RequiresPermissions多权限任选一参数用法

    @RequiresPermissions(value={"xxx:xxx","xxx:xxx"},logical=Logical.OR)

  7. SELinux导致无法访问外网,PHP连接MySQL异常Can't connect to MySQL server、redis程序访问提示Redis server went away的解决方法

    今天上班遇到的问题,新配的Linux服务器,php.Apache和一系列扩展插件装好后,在本地好好的程序移上去就一直抱数据库连接错误,而用sql命令却能连接上去, 做了一个简单的判断数据库连接页面还是 ...

  8. c#实现高斯模糊

    说说高斯模糊 高斯模糊的理论我这里就不太多费话了,百度下太多,都是抄来抄去. 主要用到二个函数“高斯函数” 一维形式为: 二维形式为: X,Y对应的一维二维坐标,σ表示模糊半径(半径* 2 + 1) ...

  9. CentOS6.5安装mysql-5.7.18-1.el6.x86_64.rpm-bundle.tar

    本文内容为转载内容,具体作者忘记是谁了,在收藏夹找到的 先去官网(https://dev.mysql.com/downloads/mysql/),在Select Operating System选择R ...

  10. 反省在北京某S2B2C电商小型公司面试时掉链子的问题

    昨天,参与北京一家公司面试时,不知道为什么,错了很多题,这些题在该家公司之前已经被问很多次了,当天精神恍惚的没答上来或答错,被问到数据库优化和乐观锁的问题,首先我谈到了存储引擎底层的数据结构 B树/B ...