我怎样才能获得数组的实际数量?

Rog*_*lgo 6 javascript arrays size count

我试过这种方式,但它给我错误的计数:

myArr = [];
myArr[666] = 'hello there';
console.log(myArr.length); // returns me 667
Run Code Online (Sandbox Code Playgroud)

它应该是1.我怎样才能以最快的方式获得好的数量呢?

T.J*_*der 17

它应该是1.

不,它应该是667,因为这length是在JavaScript中为标准数组定义的,它们根本不是真正的数组.JavaScript中的数组本质上是稀疏的,这意味着它们中可能有漏洞(索引中不存储任何类型的值).

我怎样才能以最快的方式获得好的数量呢?

唯一的方法是循环.例如:

var count = 0;
myArr.forEach(function() {
    ++count;
});
console.log(count);
Run Code Online (Sandbox Code Playgroud)

...或通过reducemaček的答案.forEach,reduce和其他这样的访问条目实际存在,因此他们跳过稀疏数组中的漏洞.


我应该提一下,因为IE8仍然(叹气)有相当大的市场份额,你需要垫片forEach等等reduce,如果你想使用它们.(这很容易.)

要做到这一点没有任何垫片,只计算实际索引属性(而不是其他类型的属性),然后松散:

var count = 0, name;
for (name in myArr) {
    if (myArr.hasOwnProperty(name) && /^[0-9]+$/.test(name)) {
        ++count;
    }
}
Run Code Online (Sandbox Code Playgroud)

它使用稍微宽松的索引属性名称定义; 如果你想要一个健壮的,请参阅这个答案的 "正确使用"部分.


mač*_*ček 8

您可以使用reduce计算非未定义属性的数量

var length = myArr.reduce(function(len) { return len+1; }, 0);
console.log(length); // 1
Run Code Online (Sandbox Code Playgroud)


Tri*_*ics 5

因为数组的索引 [0...666]是667项.如果您真的想要计算您拥有的项目数量,那么数组可能不是最佳解决方案.