「変換は削減するためのより強力な代替手段です」と述べる以外に、違いが何であるかについてのドキュメントは見つかりません。 lodashのtransformとreduceの違いは何ですか( 25%遅い 以外)?
ユーティリティを取り込む前に、ソースコードに飛び込むのが好きです。 lo-dashの場合、すべてのユーティリティに抽象化された内部機能が大量にあるため、これは難しい場合があります。
したがって、明らかな違いは次のとおりです。
_.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;
});
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;
}, {});
全体的に、アキュムレータをより細かく制御できるため、reduceはより柔軟な方法ですが、場合によってはtransformを使用して、よりシンプルなスタイルで同等のコードを記述することができます。