如果我有一个将对象作为值的数组,例如:
var a = [];
a[21] = {};
a[90] = {};
a[13] = {};
alert(a.length); // outputs 91
我找到了一种解决方法来获取实际长度:
function getLength(arr) {
return Object.keys(arr).length;
}
var a = [];
a[21] = {};
a[90] = {};
a[13] = {};
alert(getLength(a));
但是,当对象以随机索引存储时,为什么JS的长度不正确?它只是在数组上找到的最大索引上加1。像上面的示例一样,90是最大的索引。它只加1并给出91作为输出。示范
这是因为length
为您index
提供了阵列中的下一个。
arrayLength
如果传递给Array构造函数的唯一参数是0到2 ^ 32-1(含)之间的整数,则返回一个新的JavaScript数组,其长度设置为该数字。
因为您没有在21、90、13之外的其他键中插入任何元素,所以其余所有索引都包含undefined
。演示
要获取数组中元素的实际数量:
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);
编辑
如果数组包含大量元素,则循环获取其长度不是最佳选择。
正如您在问题中提到的那样Object.keys(arr).length
,考虑到没有在该数组上添加任何属性,在这种情况下是最好的解决方案。否则,length
将不会是您所期望的。(感谢@RobG)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句