2012-09-27 6 views
8

Nur wundernd, wenn Sie array.length verwenden, erhält es den letzten Indexwert und fügt eins hinzu. Was passiert, wenn Sie einen Array haben, die auf diese Weise aus irgendeinem Grunde definiert:Wie kann die absolute Array-Länge in JavaScript am besten gezählt werden?

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

Was ist der absolut beste Weg, um die wahre Länge dieses Array zu bekommen? Etwas, das 2 als Wert zurückgibt.

Ich dachte so etwas, aber nicht sicher, ob es bereits eine Methode dafür gab, oder ob es eine schnellere Implementierung gibt.

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

Antwort

10

Array.prototype.reduce nur zu Fuß s über bestehende Indizes, so können Sie tun:

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

"Aber Onkel Zirak! reduce meine Eltern getötet!“Seien Sie nicht, jung eine Sorge, können wir Array.prototype.filter nutzen!

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

"All das Array Zeug langweilig!" Nun, Whadya daran denken !?

Object.keys(myArray2).length; 

"Aber ... aber ... aber Zirak !!!! ! Wir sind Amish, wir haben nicht ECMAScript 5 noch“Haben Sie keine Angst, Zirak ist hier

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

Aber in Zeiten wie diesen muss man sich fragen: Warum all das tun und trotzen den Zweck das Array, ein strukturiertes Konstrukt, sondern etwas anderes fit für den Zweck der Verwendung?

+2

Nun, das ist elegant. –

+0

Nizza. natürlich können Sie‘ d benötigt eine Implementierung von 'Array.prototype.reduce' für IE <9 –

+0

@TimDown Compen satt dafür (und einige mehr.) – Zirak

2

Iterieren durch Array mit 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

Alternative Prototype-Methode:

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} 
} 

Beispiel:

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

Ich würde verwenden 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; 
} 
0
function TrueArrayLength (myArray2) 
{ 
var TrueLength = 0;  
for (var i = 0; i < myArray2.length; i++) 
{ 
    if (i in myArray2) 
    { 
     TrueLength += 1; 
    } 
} 

return TrueLength; 
} 

mit dieser Funktion kann und nutzen Sie die wahren Array Längen.

Verwandte Themen