6

Javascript で reduce() メソッドを使用して、このような関数を作成する必要があるかどうかを決定しようとしています。

var x = [some array], y = {};
for (...) {
    someOperation(x[i]);
    y[x[i]] = "some other value";
}

これは明らかに、次の方法で reduce() 関数として記述できます。

x.reduce(function(prev, current, index, arr) {
    someOperation(current);
    prev[current] = "some other value";
    return prev;
}, {})

またはそのようなもの。両者の間にパフォーマンスやその他の違いはありますか? または、Web プログラミング環境でどちらを優先する必要があるかという他の理由 (たとえば、ブラウザーのサポートなど) はありますか? ありがとう。

4

4 に答える 4

4

私はこれらの操作 (reduce、map、filter など) を好みますが、特定のブラウザーが実装でサポートしていないため、これらを使用することはまだ現実的ではありません。確かに、プロトタイプを拡張して「パッチ」を適用することはできますが、それArrayはワームの缶を開けてしまうことにもなります。

これらの関数に本質的に問題があるとは思いませんし、より良いコードになると思いますが、今のところは使用しないことをお勧めします。人口のより高い割合がこれらの機能をサポートするブラウザーを使用すると、公平なゲームになると思います.

パフォーマンスに関しては、関数呼び出しによるオーバーヘッドのため、これらは for ループの手書きよりもおそらく遅くなります。

于 2011-06-16T01:35:18.467 に答える
4

mapand filterand reduceand forEachand ... (詳細: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array#Iteration_methods ) は、通常のループよりもはるかに優れています。

  1. 彼らはよりエレガントです
  2. それらは関数型プログラミングを奨励します (関数型プログラミングの利点を参照)
  3. とにかく関数を作成し、パラメータとして反復変数を渡す必要があります。これは、javascript にはブロック スコープがないためです。mapやのような関数をreduce使用すると、反復変数が自動的に設定されて関数に渡されるため、作業が非常に簡単になります。

IE9 はこれらをサポートしていると主張しています。それらは公式の javascript/ecmascript 仕様にあります。IE8 を使用している人を気にかけているのであれば、それはあなたの特権です。本当に気にするなら、Array.prototypeIE8以前のみをオーバーライドしてハックし、IE8以前を「修正」することができます。

于 2011-07-18T07:22:20.607 に答える
2

reduce は、前の要素の結果を順次処理した結果として、配列から 1 つの値を返すために使用されます。

reduceRight も同じことを行いますが、最後から開始して逆方向に動作します。

map は、メンバーがすべて関数を介して渡された配列を返すために使用されます。

どちらの方法も配列自体には影響しません。

var A1= ['1', '2', '3', '4', '5', '6', '7',' 8'];

// この map の使用により、数値に変換された元の要素の新しい配列が返されます-

A1=A1.map(数字); // >> A1 の各要素を数値に変換

// これにより、配列要素の合計が削減されます-

var A1sum= A1.reduce(function(a, b){ return a+b;});

// A1sum>> 戻り値: (数値) 36

これらは古いブラウザではサポートされていないため、代わりのブラウザを提供する必要があります。あなたがしていることすべてが単純なループで複製できるなら、それは価値がありません。

母集団の標準偏差を計算することは、map と reduce の両方を効果的に使用できる例です。

Math.mean= function(array){
    return array.reduce(function(a, b){ return a+b; })/array.length;
}
Math.stDeviation=function(array){
    var mean= Math.mean(array);
    dev= array.map(function(itm){return (itm-mean)*(itm-mean); });
    return Math.sqrt(dev.reduce(function(a, b){ return a+b; })/array.length);
}


var A2= [6.2, 5, 4.5, 6, 6, 6.9, 6.4, 7.5];
alert ('mean: '+Math.mean(A2)+'; deviation: '+Math.stDeviation(A2))
于 2011-06-16T02:11:17.090 に答える
0

kennebec-順調ですが、stDeviation関数の呼び出しは2回削減され、1回の呼び出しで削減する必要がある場合は1回マップされます(これにより、はるかに高速になります)。

Math.stDev = function (a) {
    var n = a.length;
    var v = a.reduce(function (v, x) {
      v[0] += x * x;
      v[1] += x;
      return v;
    }, [0,0]);
    return Math.sqrt( (v[0] - v[1]*v[1] / n) / n );
}

文字列番号が結果と混同しないように、 v [1]に割り当てるときに数値に変換する必要があります。ほとんどの場合、最後の行の除数は(n-1)になるはずですが、それはOP次第です。 。:-)

于 2011-06-16T04:13:46.553 に答える