在Javascript中查找数组长度

Find Array length in Javascript

本文关键字:数组 查找 Javascript      更新时间:2023-09-26

这个问题听起来很傻。我们如何在JavaScript中找到数组的确切长度;更确切地说,我想找到数组中占据的总位置。

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

var a = [1,2,3];
a.length; //This will output 3

现在如果我给

a[100] = 100;
a.length; // The output is 101; 

我想得到数组的确切大小,在上面的情况下应该是4。

您要查找的不是数组的长度,而是该数组中分配的数值。

Array.length不会给您该结果,而是给您分配的值的总数。

一个解决方法是计算数组后面对象的属性,使用:

Object.keys(a).length

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

但需要注意的是:

  • 它还会计算文字属性,比如a.a_property。我认为这不是你想要的。因此,您必须筛选该结果:

CCD_ 2检查CCD_ 3是否可以被视为数字属性,即使它具有字符串类型。

  • 您希望只计算正整数,因此必须使用以下内容对其进行筛选:

+el>=0

  • 最后,由于数组大小限制为2^32,您还需要筛选大于此值的正整数:

+el < Math.pow(2,32)

从功能上讲,你会得到这个过滤器的结果:

Array.realLength= Object.keys(a).filter(function(el){return !(+el % 1) && +el>=0 && +el < Math.pow(2,32) ;}).length 

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

数组的大小正是length属性所显示的大小。

即使您只给前3个位置(0,1,2)一个值,当您给a[100]一个值100时,您将其调整为101个位置。因此,您将获得每个位置的计数,从0(第一个索引)到100(最后一个索引),即使它们没有值。

使用代码a[100] = 100,您将在数组中的位置100创建一个块。(自0开始,总计101)。

如果你想知道块中有多少实际答案,你必须使用一个循环来检查哪些字段不等于未定义字段。有几十种方法可以使用forwhileforeach等来实现这一点。

只需实现一个计数器,并对数组中不等于nullundefined的部分进行计数。这将为您提供数组中实际使用的位置数。