Rex*_*low 18 javascript arrays
如果我有一个数组,其对象作为索引的值,如:
var a = [];
a[21] = {};
a[90] = {};
a[13] = {};
alert(a.length); // outputs 91
Run Code Online (Sandbox Code Playgroud)
我找到了一个解决方法来获取实际长度:
function getLength(arr) {
return Object.keys(arr).length;
}
var a = [];
a[21] = {};
a[90] = {};
a[13] = {};
alert(getLength(a));
Run Code Online (Sandbox Code Playgroud)
但是,当对象存储在随机索引时,为什么JS会给出不正确的长度?它只是在数组上找到的最大索引加1.与上面的例子一样,90是最大的指数.它只增加1并输出91.示范
Tus*_*har 12
那是因为length给你下一个index可用的数组.
arrayLength
如果传递给Array构造函数的唯一参数是0到2 ^ 32-1(包括)之间的整数,则返回一个长度设置为该数字的新JavaScript数组.
因为您没有在21,90,13之外的其他键中插入任何元素,所以其余所有索引都包含undefined.DEMO
要获取数组中的实际元素数:
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);Run Code Online (Sandbox Code Playgroud)
更短的版本
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);Run Code Online (Sandbox Code Playgroud)
编辑
如果数组包含大量元素,则循环获取其长度不是最佳选择.
正如您在问题中提到的那样,Object.keys(arr).length在这种情况下,考虑到您没有在该阵列上添加任何属性,这是最佳解决方案.否则,这length将不是你所期望的.(感谢@RobG)
JavaScript中的数组是一个简单的从零开始的结构。的array.length返回n + 1,其中n是在阵列的最大索引。
这就是它的工作原理-当您分配第90个元素并且该数组的长度小于90时,它将数组扩展为90并设置第90个元素的值。所有缺少的值均解释为null。
如果您尝试以下代码:
var a = [];
a[21] = {};
a[90] = {};
a[13] = {};
console.log(JSON.stringify(a));
Run Code Online (Sandbox Code Playgroud)
您将获得以下JSON:
[null,null,null,null,null,null,null,null,null,null,null,null,null,{},null,null,null,null,null,null,null,{},null,null null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null ,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,{}]
而且,array.length不是只读值。
如果您设置的length值小于当前值,则将调整数组的大小:
var arr = [1,2,3,4,5];
arr.length = 3;
console.log(JSON.stringify(arr));
// [1,2,3]
Run Code Online (Sandbox Code Playgroud)
如果设置了length值更比当前,那么阵列将被扩大,以及:
var arr = [1,2,3];
arr.length = 5;
console.log(JSON.stringify(arr));
// [1,2,3,null,null]
Run Code Online (Sandbox Code Playgroud)
如果需要分配此类值,则可以使用JS对象。
您可以将它们用作关联数组并分配任何键值对。
var a = {};
a[21] = 'a';
a[90] = 'b';
a[13] = 'c';
a['stringkey'] = 'd';
a.stringparam = 'e'; // btw, a['stringkey'] and a.stringkey is the same
console.log(JSON.stringify(a));
// returns {"13":"c","21":"a","90":"b","stringkey":"d","stringparam":"e"}
console.log(Object.keys(a).length);
// returns 5
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19422 次 |
| 最近记录: |