在JavaScript中计算绝对数组长度的最佳方法是什么?

the*_*ect 8 javascript

只是想知道,当你使用array.length它时,获取最后一个索引值并添加一个.如果您有一个数组,由于某种原因以这种方式定义,该怎么办:

    var myArray2 =[];
    myArray2[10]='x';
    myArray2[55]='x';
Run Code Online (Sandbox Code Playgroud)

获得此阵列真实长度的绝对最佳方法是什么?会返回2作为值的东西.

我正在考虑这样的事情,但不确定是否已有一种方法,或者是否有更快的实现.

Array.prototype.trueLength= function(){
    for(var i = 0,ctr=0,len=myArray2.length;i<len;i++){
        if(myArray2[i]!=undefined){
            ctr++;
        }
    }
    return ctr;        
}
console.log(myArray2.trueLength());
Run Code Online (Sandbox Code Playgroud)

Zir*_*rak 10

Array.prototype.reduce 只遍历现有索引,所以你可以这样做:

var length = myArray2.reduce(function(sum) {
    return sum+1;
}, 0);
Run Code Online (Sandbox Code Playgroud)

"但是齐拉克叔叔!reduce杀死了我的父母!" 别担心,年轻人,我们可以使用Array.prototype.filter!

var length = myArray2.filter(function(item, idx) {
    return idx in myArray2;
}).length;
Run Code Online (Sandbox Code Playgroud)

"所有这些阵列都很无聊!" 嗯,whadya想到这个!?

Object.keys(myArray2).length;
Run Code Online (Sandbox Code Playgroud)

"但是......但......但Zirak !!!!我们是阿米什人,我们还没有ECMAScript 5!" 没有恐惧,齐拉克在这里!

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

但有时这样,人们不禁要问:为什么要这样做并且违背数组的目的,一个结构化的构造,而不是使用其他适合其目的的东西?

  • 嗯,这很优雅. (2认同)