这听起来很愚蠢。我们怎样才能在JavaScript中找到数组的确切长度;更确切地说,我想找到阵列中占据的总位置。
我有一个简单的场景,我猜大多数人可能都知道。
var a = [1,2,3];
a.length; //This will output 3
现在,如果我给
a[100] = 100;
a.length; // The output is 101;
我想获得数组的确切大小,在上面的情况下应该是4。
答案 0 :(得分:17)
这将为您提供阵列中真正存在的元素数量:
Object.keys(a).length
修改强>
正如JLRishe的评论所指出的, Object.keys(a)。length 返回对象a中存在的键数。 如果我添加这样的键:
a= [1,2,3];
a['key']= "akey";
然后 Object.keys(a)。length 将返回4
但" key"不是数组的一部分,它是数组Object的属性, console.log(a)为您提供[1,2,3]。
因此,要获得更可靠的数组元素数量值,我们只需计算正整数键值:
Object.keys(a).filter(function(el){return !(+el % 1) && +el>=0 && +el < Math.pow(2,32) ;}).length
Object.keys返回一个String数组。使用a['1']
或a[1]
在数组中分配值是等效的。
数组索引键也必须小于2 ^ 32。
答案 1 :(得分:3)
TL; DR我能想到的最简单可靠的方法如下:
var count = a.filter(function() { return true; }).length;
在现代JavaScript引擎中,这可以缩短为:
var count = a.filter(() => true).length;
<小时/> 完整答案:
检查undefined
是不够的,因为数组实际上可能包含 undefined
值。
找到元素数量的可靠方法是......
使用in
运算符:
var count = 0;
for (var i = 0; i < a.length; i += 1) {
if (i in a) {
count += 1;
}
}
使用.forEach()
(基本上使用in
):
var a = [1, undefined, null, 7];
a[50] = undefined;
a[90] = 10;
var count = 0;
a.forEach(function () {
count += 1;
});
console.log(count); // 6
或使用.filter()
,谓词始终为true:
var a = [1, undefined, null, 7];
a[50] = undefined;
a[90] = 10;
var count = a.filter(function () { return true; }).length;
console.log(count); // 6
答案 2 :(得分:0)
数组的大小正是length属性所显示的。
即使你只给前3个位置(0,1,2)赋值,当你给a a [100]赋值100时,你把它的大小调整为101个位置。因此,您将得到每个位置的计数,从0(第一个索引)到100(最后一个索引),即使它们没有值。
答案 3 :(得分:0)
使用您的代码:a[100] = 100
,您将在阵列中的位置100处创建一个块。 (自0开始以来总共101个)。
如果要查看块中有多少实际答案,则必须使用循环并循环检查哪些字段不等于未定义。使用for
,while
,foreach
等可以通过多种方式执行此操作。
只需实现一个计数器,并计算数组中不等于null
或undefined
的部分。这将为您提供阵列中实际使用的位置数。