2

JavaScript の Array クラスに max/min 関数を追加する方法を探していましたが、これは解決済みの問題のようでした: JavaScript: min & max Array values? . ただし、それを使用しようとすると、コードからエラーが発生し始めました。このアプローチはループでは機能しないことがわかりました。

for(i in myArray) { console.log(i) } 

プリントアウト


1 
2
3
最大

私が使用できる別のアプローチはありますか?

4

5 に答える 5

10

受け入れられた解決策は差し迫った問題を解決しますが、コア オブジェクトを拡張することは一般的に悪い考えです。を使用するライブラリを後で含めるとどうなりますfor..inか? または、数か月後に忘れて、コードの別のセクションで間違ったアプローチを使用した場合は?

別のオプションは、ラップして拡張することです。のインスタンスをArrayプロトタイプとして使用する新しい型を作成します。

function ArrayThing() {}

ArrayThing.prototype = new Array();

これで、影響を与えずに拡張できるオブジェクトができましたArray

ArrayThing.prototype.max = function() {
    return Math.max.apply(null, [].slice.call(this, 0))
}

ArrayThing.prototype.min = function() {
    return Math.min.apply(null, [].slice.call(this, 0))
}

var list = new ArrayThing();

// standard array methods still work
list.push(5);
list.push(22);
list.push(0);
list.push(-14);
list.length // => 4

// as do your new custom methods
list.max() // => 22
list.min() // => -14

これはすべての状況で機能するわけではありませんが、本当に本当に が必要であると確信していない限りArray、これは便利な代替手段です。

于 2011-02-16T19:49:44.603 に答える
6

for...inループは、オブジェクトのプロパティをループするために使用されます。配列から値を取得する場合は、次のようにします。

for (var i = 0; i < myArray.length; i++)
{
    console.log(myArray[i])
}
于 2011-02-16T19:15:43.870 に答える
2

for in一般的な Javascript トラップです。他の言語の のように動作する代わりに、foreach実際には特定のオブジェクトのすべてのプロパティを列挙します。

Javascript 配列はたまたま各インデックスのプロパティを使用してfor in動作することがあるため、ご覧のとおり、追加した他のプロパティも列挙します。もう 1 つの問題は、for inが特定の順序でプロパティを通過することが保証されていないため、使用するブラウザー/ランタイムによって結果が異なる可能性があることです。

forその場合は、代わりに退屈なループを使用する方が安全です。Javascript には多くのforループ イディオムがあるので、いくつかリストします。

通常の for ループ:

for(i=0; i<arr.length; i++){

通常のループ、長さのキャッシュ:

for(i=0, n=arr.length; i<n; i++){

オブジェクト/NodeList の配列をループします。

for(i=0; obj=arr[i]; i++){ //this works as long as the array has no falsy values
    foo(obj)
于 2011-02-16T19:25:19.100 に答える
1

hasOwnProperty を使用してチェックを適用する必要があります。ただし、これはループしている場所に適用する必要があります。

すなわち:

for(i in myArray)
{
  if(arr.hasOwnProperty(i))
  {
   console.log(i);
  }
}
于 2011-02-16T19:15:33.503 に答える
0

これを行うためのより現代的な (IE9+) 方法があります。

var g = []; 

Object.defineProperty(g, "log", {
  enumerable: false,
  configurable: false,
  writable: false,
  value: function(){ console.log(this); }
});


g.push(5); 
g.push(9); 

var t;
for (t in g){
    console.log(g[t]);
}

5 と 9 を出力しますが、「ログ」機能をリストしません

g.log() -> echos [5,9]

この作業の鍵は、プロパティに "enumerable: false" というフラグを立てて、プロパティを繰り返してはならないものとしてマークできることです。

Object.defineProperty の詳細: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

于 2014-08-21T14:47:42.760 に答える