web-dev-qa-db-ja.com

lodashのtransformとreduceの違いは何ですか

「変換は削減するためのより強力な代替手段です」と述べる以外に、違いが何であるかについてのドキュメントは見つかりません。 lodashのtransformとreduceの違いは何ですか( 25%遅い 以外)?

48
Kris Erickson

ユーティリティを取り込む前に、ソースコードに飛び込むのが好きです。 lo-dashの場合、すべてのユーティリティに抽象化された内部機能が大量にあるため、これは難しい場合があります。

したがって、明らかな違いは次のとおりです。

  • accumulator(一般的にmemoと呼ばれる)を指定しない場合'アンダースコアに使用されます)、_.transformは配列またはオブジェクトが必要かどうかを推測し、reduceはアキュムレータをコレクションの最初のアイテムにします。

例、transformを介した配列またはオブジェクトマップ:

_.transform([1, 2, 3], function(memo, val, idx) {
    memo[idx] = val + 5;
});
// => [6, 7, 8]

Vs. reduce(注、入力タイプを知っている必要があります!)

_.reduce([1, 2, 3], function(memo, val, idx) {
    memo[idx] = val + 5;
    return memo;
}, []);

したがって、reduceを使用すると、以下で配列の合計が計算されますが、aは配列であるため、変換ではこれは不可能です。

var sum = _.reduce([1, 2, 3, 4], function(a, b) {
    return a + b;
});
  • もう1つの大きな違いは、アキュムレータをtransformで返す必要がなく、アキュムレータが値を変更できないことです(つまり、常に同じ配列になります)。 reduceを使用してアキュムレータを返すことを忘れることが多いため、これがこの関数の最大の利点だと思います。

たとえば、reduceを使用して配列を値の辞書に変換する場合は、次のようなコードを記述します。

_.reduce([1, 2, 3, 4, 5], function(memo, idx) {
   memo[idx] = true;
   return memo;
}, {});

一方、変換では、reduceのようにアキュムレータを返す必要なく、これを非常にうまく書くことができます

_.transform([1, 2, 3, 4, 5], function(memo, idx) {
   memo[idx] = true;
}, {});
  • もう1つの違いは、falseを返すことで変換の反復を終了できることです。

全体的に、アキュムレータをより細かく制御できるため、reduceはより柔軟な方法ですが、場合によってはtransformを使用して、よりシンプルなスタイルで同等のコードを記述することができます。

82
megawac