8

不思議に思うのですarray.lengthが、使用すると最後のインデックス値が取得され、1つ追加されます。配列がある場合、それは何らかの理由でこのように定義されます。

    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!!!!私たちはアーミッシュです。まだECMAScript5を持っていません!」恐れることはありません、Zirakはここにいます!

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

しかし、このようなときは、疑問に思う必要があります。目的に合ったものを使用する代わりに、なぜそれをすべて行い、構造化された構造である配列の目的に逆らうのでしょうか。

于 2012-09-27T11:36:50.747 に答える
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());
于 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

演算子を使用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 に答える
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 に答える