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

时间:2012-09-27 10:43:45

标签: javascript

只是想知道,当你使用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 个答案:

答案 0 :(得分:10)

Array.prototype.reduce仅遍历现有索引,因此您可以执行以下操作:

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

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

var length = myArray2.filter(function(item, idx) {
    return idx in myArray2;
}).length;

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

Object.keys(myArray2).length;

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

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

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

答案 1 :(得分: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());

答案 2 :(得分: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

答案 3 :(得分:0)

我使用the in operator

function getArrayPropertyCount(arr) {
    var count = 0;
    for (var i = 0, len = arr.length; i < len; ++i) {
        if (i in arr) {
            ++count;
        }
    }
    return count;
}

答案 4 :(得分:0)

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

return TrueLength;
}

使用此函数并获得真正的数组长度。