4

underscorejs はどのように機能しますreduceか?

取得するのは簡単です _.reduce([1, 2, 3], function(memo, num){ return memo + num; }, 0);(結果は です6)。

しかし、他のオプションのパラメーターはどのように機能するのでしょうか? ドキュメントには次のように書かれています。

Memo はリダクションの初期状態であり、その連続する各ステップは iterator によって返される必要があります。反復子には 4 つの引数が渡されます: メモ、反復の値とインデックス (またはキー)、最後にリスト全体への参照です。"

しかし、私は理解していません。次の問題に使用しようとしreduceましたが、わかりませんでした。

var input = [{"score": 2, "name": "Jon", "venue": "A"}, {"score": 3, "name": "Jeff", "venue":"A"}, {"score": 4, "name": "Jon", "venue":"B"}, {"score": 4, "name": "Jeff", "venue":"B"}];

var output = [{"score": 6, "name":"Jon", "venue": ["A", "B"]}, {"score": 7, "name":"Jeff", "venue": ["A", "B"]}];

入力に使用して出力として取得するにはどうすればよい_reduceですか? そして、reduce 内でどのように機能するかは本当に役に立ちます。

4

2 に答える 2

10

Reduce は値のリストを取り、それを 1 つの値に減らします。あなたがしようとしているのは、単に削減することではありません。最初に(名前で)グループ化し、次に各グループを削減しようとしています。考えられる実装は、最初にグループ化し、次に各グループをスコアを累積して会場を追加する削減操作にマップする、このようなものです。

var input = [
    {"score": 2, "name": "Jon", "venue": "A"}, 
    {"score": 3, "name": "Jeff", "venue":"A"}, 
    {"score": 4, "name": "Jon", "venue":"B"}, 
    {"score": 4, "name": "Jeff", "venue":"B"}];

var output = _.map(_.groupBy(input, "name"), function(group, name) {
    return _.reduce(group, function(memo, elem) { 
            memo.score += elem.score;
            memo.venue.push(elem.venue);
            return memo;
        },
        { name: name, score: 0, venue: [] });
});
于 2013-08-01T22:22:15.717 に答える