Array.length给出错误的长度 [英] Array.length gives incorrect length

查看:69
本文介绍了Array.length给出错误的长度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我有一个将对象作为值的数组,如:

If I have an array having object as values at the indices like:

var a = [];
a[21] = {};
a[90] = {};
a[13] = {};
alert(a.length); // outputs 91

我找到了一种解决方法来获取实际长度:

I have found a workaround to get the actual length:

function getLength(arr) {
    return Object.keys(arr).length;
}
var a = [];
a[21] = {};
a[90] = {};
a[13] = {};
alert(getLength(a));

但是,当对象存储在随机索引中时,为什么JS给出的长度不正确?只是在数组上找到的最大索引上加1.像上面的示例一样,90是最大的索引.它只加1并给出91作为输出. 演示

But, why does JS gives incorrect length when objects are stored at random indices? It just adds 1 to the largest index found on an array. Like in the above example, 90 was the largest index. It just adds 1 and gives 91 as output. Demonstration

推荐答案

这是因为

That's because length gives you the next index available in the array.

DOCS

arrayLength

如果传递给Array构造函数的唯一参数是0到2 ^ 32-1(含)之间的整数,则会返回一个新的JavaScript数组,其长度设置为该数字.

If the only argument passed to the Array constructor is an integer between 0 and 2^32-1 (inclusive), this returns a new JavaScript array with length set to that number.

ECMA规范

因为您没有在21、90、13之外的其他键中插入任何元素,所以其余所有索引都包含undefined. 演示

Because you don't have inserted any element in the other keys than 21, 90, 13, all the remaining indexes contains undefined. DEMO

要获取数组中元素的实际数量:

To get actual number of elements in the array:

var a = [];
a[21] = {};
a[90] = {};
a[13] = {};

var len = 0;

for (var i = 0; i < a.length; i++) {
  if (a[i] !== undefined) {
    len++;
  }
}
document.write(len);

更短的版本

var a = [];
a[21] = {};
a[90] = {};
a[13] = {};


for (var i = 0, len = 0; i < a.length; i++, a[i] !== undefined && len++);


document.write(len);

演示

编辑

如果数组包含大量元素,则循环获取其长度不是最佳选择.

If the array contains large number of elements, looping to get its length is not the best choice.

正如您在问题中提到的,考虑到您没有在该数组上添加任何属性,在这种情况下, Object.keys(arr).length 是最好的解决方案.否则,length不会是您所期望的.(感谢@RobG)

As you've mentioned in the question, Object.keys(arr).length is the best solution in this case, considering that you don't have any properties added on that array. Otherwise, the length will not be what you might be expecting.(Thanks To @RobG)

这篇关于Array.length给出错误的长度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆