2012-01-16 6 views
0

現在、JavaScriptでプロトタイプを使用して頭を上げようとしています。使用例は以下のようになりプロトタイプを使用するときにJavaScriptで列挙を停止する

Array.prototype.where=(function(){ 
    var tmpArr=[], 
     success; 

    for (var x in this){ 
    var success=true; 
    for (var i in arguments){ 
     if (this[x][arguments[i][0]]!=arguments[i][1]){ 
     success=false; 
     break; 
     } 
    } 

    if (success==true){ 
     tmpArr.push(this[x]); 
    } 
    } 
    return tmpArr; 
}); 

arrayName.where([0, 'Fred'], [1, 'Bloggs']); 

については

はこれで実験する

は、私は、アレイ上にwhere句を置くことを可能として有効に働く機能を書いていますテストのために、これはかなりうまくいく。唯一の問題は、実行していた場合です

for (var x in someArrayHere){ 
    console.log(someArrayHere[x]); 
} 

出力は配列になりますが、プロトタイプ化した関数を表すレコードが出力されます。

私が解決できる限り、これは、関数を非列挙型として設定してソートされていますが、停止方法を説明する記事は見つかりません。

どうすればいいですか?それとも毎回以下のことをしなければならないでしょうか?

for (var x in someArray){ 
    if (typeof tSch[x]!="object"){ 
    } 
} 

答えて

2

for...in構築物は、オブジェクト(およびプロトタイプチェーンをダウン継承されたもの)のすべてのプロパティを列挙する。配列と共に使用すると、配列の要素だけでなく、Array.prototypeのすべてのプロパティに対して繰り返し処理が行われます。これを防ぐために

利用ノーマルforループ:一般的に

for(var x = 0; x < this.length; x++) { 
    //Do stuff 
} 
+0

さて、それは残念です= [ ありがとう! – Doug

+0

問題ありません。これを回避するには、他のいくつかの答えで説明したように 'Object.hasOwnProperty'を使用することができます。私が言及しなかった理由はそれがかなり悪い習慣であるということです。おそらく、ネイティブオブジェクトで 'for ... in'を使うべきではありません! –

+0

もう1つの可能な解決方法は、使用可能な場合はネイティブの 'Array.prototype.forEach'メソッドを使用し、そうでない場合はshimを使用することです。https://github.com/kriskowal/es5-shim/ –

0

、ネイティブオブジェクトのプロトタイプで、あなたがすべきではない混乱。これにより、特にexternコード/ライブラリとの組み合わせで問題が発生します。

代わりに、配列パラメータ(たとえば、function arrayWhere(arr))で動作する関数にする必要があります。

あなたはネイティブのプロトタイプを拡張するに固執する場合in this exampleが説明するように、あなたは、forEach方法(新しいブラウザ、MDNで説明するように、多分フォールバックを追加)、またはオブジェクトのhasOwnProperty方法と配列を反復処理する必要があります。

1

一般に、for ... inループを使用して配列を反復処理するのは悪い習慣です。

しかし、簡単な修正は、Object.hasOwnPropertyを使用することです:

for (var x in someArray) { 
    if (someArray.hasOwnProperty(x)) { 
    //... 
    } 
} 

これはあなたのループよりも堅牢なアプローチです。

関連する問題