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());
4

5 回答 5

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;

“这阵法都无聊!” 好吧,你怎么想的!?

Object.keys(myArray2).length;

“但是……但是……但是 Zirak!!!!我们是阿米什人,我们还没有 ECMAScript 5!” 别怕,齐拉克来了!

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

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

于 2012-09-27T11:36:50.747 回答
2

使用 遍历数组for injsfiddle

Array.prototype.trueLength= function(){
  var ctr = 0;  
  for(var i in this){
        if(this.hasOwnProperty(i)){
            ctr++;
        }
    }
    return ctr;        
}
console.log(myArray2.trueLength());
于 2012-09-27T10:48:44.910 回答
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
于 2012-09-27T11:03:45.433 回答
0
function TrueArrayLength (myArray2)
{
var TrueLength = 0;    
for ( var i = 0; i < myArray2.length; i++) 
{
    if (i in myArray2) 
    {
        TrueLength += 1;
    }
}

return TrueLength;
}

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

于 2013-11-08T00:09:04.173 回答
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;
}
于 2012-09-27T11:30:50.310 回答