在Javascript中查找数组长度

11

这可能听起来是一个非常愚蠢的问题。在JavaScript中,如何找到数组的确切长度;更准确地说,我想找到数组中占用的总位置数。

我有一个简单的情景,我猜你们大多数人都知道。

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

现在如果我给

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

我想获取数组的确切大小,在上面的例子中应该是4。


检查数组是否按递增顺序填充,如果是,则检查第一个未定义的值。 - lateralus
1
做一个for循环并递增计数器,除了undefined - Rakesh_Kumar
1
在Javascript中,数组没有固定的长度,因此当您执行a [0] = 1; a [100] = 100时,长度变为“101”。您可以做的一件事是从0->数组长度循环,并跟踪不是“undefined”的值。 - Arkantos
1
@Rakesh_Kumar 你是指像这样的东西吗 for (i= 0 ; a[i] != undefined || a[i] != null ;i++); 但这在我们的情况下不起作用。因为它会在索引=3处停止循环; - Yameen
1
@Yameen http://jsfiddle.net/kwu3xqsm/ - Rakesh_Kumar
1
如果你似乎不想要一个有空洞的数组,为什么要创建一个有空洞的数组呢? - Felix Kling
4个回答

25

你要寻找的不是数组的长度,而是分配在该数组中的数值个数。

Array.length 不会给你这个结果,而是分配的总值的数量。

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

Object.keys(a).length

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array#%E9%95%BF%E5%BA%A6%E4%B8%8E%E6%95%B0%E5%80%BC%E5%B1%9E%E6%80%A7%E4%B9%8B%E9%97%B4%E7%9A%84%E5%85%B3%E7%B3%BB

但需要注意以下几点:

  • 它也会计算字面属性,例如 a.a_property。我不认为这是您想要的。

因此,您需要过滤该结果:!(+el % 1),它可以检查 el 是否可以被视为数字属性,即使它是字符串类型。

  • 您只希望计算正整数,因此您必须使用以下代码进行过滤:

+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 

这应该大部分时间都能正常工作,但如果有人给数组分配了非数字属性,则会出现错误。 - JLRishe
这将返回所有的键,无论是数字还是非数字。 - Gaël Barbin
2
从技术上讲,任何数值大于2^32-2的属性也不被视为数组元素,但在那一点上这是非常理论性的;) - Felix Kling
并且包括浮点数值 :-) - Gaël Barbin
1
你从未想过这有多荒谬吗? - cskwg
显示剩余2条评论

5
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

或者使用总是返回true的谓词函数与.filter()一起使用:

var a = [1, undefined, null, 7];
a[50] = undefined;
a[90] = 10;

var count = a.filter(function () { return true; }).length;

console.log(count);    // 6


这就是为什么我们不检查 undefined。我们检查它是否不是 undefined,在这种情况下增加一些计数器,并从 0 -> 数组长度重复此过程 :) - Arkantos
@Arkantos 检查每个元素是否未定义可能导致计数低于实际元素数量,这正是我的观点。 - JLRishe
哎呀,我的错误...我是在谈论OP的数组上下文,他的数组中只有整数 :) - Arkantos

0

数组的大小正好是由长度属性所显示的。

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


0

使用您的代码:a [100] = 100,您正在创建一个块,位于数组中的位置100处(由于它从0开始,因此总共有101个)。

如果您想查看块中实际答案的数量,则必须使用循环并循环检查哪些字段不等于未定义。有许多方法可以使用forwhileforeach等来完成这项工作。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接