在Javascript中查找数组长度

Yam*_*een 10 javascript arrays

这听起来是一个非常愚蠢的问题.我们怎样才能在JavaScript中找到数组的确切长度; 更确切地说,我想找到阵列中占据的总位置.

我有一个简单的场景,我想大多数人可能都知道.

var a = [1,2,3];
a.length; //This will output 3
Run Code Online (Sandbox Code Playgroud)

现在,如果我给

a[100] = 100;
a.length; // The output is 101; 
Run Code Online (Sandbox Code Playgroud)

我想得到数组的确切大小,在上面的例子中应该是4.

Gae*_*ael 17

这将为您提供数组中真正存在的元素数量:

Object.keys(a).length
Run Code Online (Sandbox Code Playgroud)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Relationship_between_length_and_numerical_properties

编辑

正如JLRishe的评论所指出的,Object.keys(a).length返回对象a中存在的键的数量.如果我添加这样的键:

a= [1,2,3];
a['key']= "akey";
Run Code Online (Sandbox Code Playgroud)

然后 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 
Run Code Online (Sandbox Code Playgroud)

Object.keys返回String数组.在数组中赋值a['1']a[1]等效.数组索引键也必须小于2 ^ 32.

  • 从技术上讲,数值为"> 2 ^ 32 - 2"的每个属性也不被认为是一个数组元素,但那时非常理论化;) (2认同)

JLR*_*she 5

TL;DR 我能想到的最简单可靠的方法如下:

var count = a.filter(function() { return true; }).length;
Run Code Online (Sandbox Code Playgroud)

在现代 JavaScript 引擎中,这可以缩短为:

var count = a.filter(() => true).length;
Run Code Online (Sandbox Code Playgroud)


完整答案:

检查undefined是不够的,因为数组实际上可以包含 undefined值。

找到元素数量的可靠方法是......

使用in运算符:

var count = 0;
for (var i = 0; i < a.length; i += 1) {
    if (i in a) {
        count += 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用.forEach()(基本上是in在引擎盖下使用):

var count = a.filter(function() { return true; }).length;
Run Code Online (Sandbox Code Playgroud)

.filter()与始终为真的谓词一起使用:

var count = a.filter(() => true).length;
Run Code Online (Sandbox Code Playgroud)