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

8

我在想,当你使用array.length时,它会获取最后一个索引值并加一。如果你有一个以某种方式定义的数组:

    var myArray2 =[];
    myArray2[10]='x';
    myArray2[55]='x';

什么是获取此数组真实长度的最佳方法? 该方法应返回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());
5个回答

9

Array.prototype.reduce 只会遍历已有的索引,所以你可以这么做:

var length = myArray2.reduce(function(sum) {
    return sum+1;
}, 0);

“但是Zirak叔叔!reduce杀了我的父母!”不用担心,年轻人,我们可以使用Array.prototype.filter
var length = myArray2.filter(function(item, idx) {
    return idx in myArray2;
}).length;

"所有这些数组的东西都很无聊!" 那么,你认为这个怎么样!?

Object.keys(myArray2).length;

"但是...但是...但是Zirak!!!我们是阿米什人,我们还没有ECMAScript 5!" 不要害怕,Zirak在这里!

for (var length = 0, i = 0; i < myArray2.length; i++) {
    if (i in myArray2) {
        length += 1;
    }
}

但在这种时候,人们不禁要问:为什么要这样做,违背数组这种有结构的构造的目的,而不使用其他更适合它的用途的东西呢?

不错。当然,你需要一个 Array.prototype.reduce 的实现来兼容 IE < 9。 - Tim Down
@TimDown 为此得到了补偿(和更多)。 - Zirak
但是,Zirak 叔叔,我仍然需要使用旧版IE工作。这是否意味着我是Amish人? - Tim Down
@TimDown 只因为所有的苹果都是水果,并不意味着所有的水果都是苹果。 - Zirak
1
正确,有些水果也可以是柠檬! - rlemon

2

使用for in循环遍历数组。 JSFiddle示例

Array.prototype.trueLength= function(){
  var ctr = 0;  
  for(var i in this){
        if(this.hasOwnProperty(i)){
            ctr++;
        }
    }
    return ctr;        
}
console.log(myArray2.trueLength());

1

替代原型方法:

Array.prototype.trueLength= function(){
    var list= [], ctr = 0, array = this;

    for(var i in array) (function(arr) {

        if(array.hasOwnProperty(i)){
            list.push(arr);
            ctr++;
        };


    }(array[i]));

    return {length: ctr, "list": list}
}

示例:

var myArray2 =[];
    myArray2[10]='44';
    myArray2[55]='55';

// list not undefined 
myArray2.trueLength().list  // ["44", "55"]

// not undefined length list
myArray2.trueLength().length // 2

0
我会使用 in 运算符
function getArrayPropertyCount(arr) {
    var count = 0;
    for (var i = 0, len = arr.length; i < len; ++i) {
        if (i in arr) {
            ++count;
        }
    }
    return count;
}

0
function TrueArrayLength (myArray2)
{
var TrueLength = 0;    
for ( var i = 0; i < myArray2.length; i++) 
{
    if (i in myArray2) 
    {
        TrueLength += 1;
    }
}

return TrueLength;
}

使用此函数并获取真实的数组长度。

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