2013-08-01 71 views
4

underscorejs reduce如何工作?使用下劃線js reduce

很容易得到 _.reduce([1, 2, 3], function(memo, num){ return memo + num; }, 0);(結果是6)。

但其他可選參數如何工作?在文檔中它說:

備註是減少的初始狀態,它的每個連續步驟應該由迭代器返回。迭代器傳遞四個參數:。備忘錄,則該值和迭代指數(或鑰匙),最後到整個列表的引用」

但我不明白,我試圖用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輸入輸出,這將非常有幫助的工作機制減少

+0

請顯示您嘗試過的內容,以便我們明確瞭解您誤解的內容。 「備忘錄」首先是初始值,然後是之後的迭代的返回值。其餘的參數是你對'.map()'或'.forEach()'方法的典型參數。 –

回答

9

減少花費?一個值列表,並將其減少到一個單一的值。你所嘗試的不是ju st減少。您正在嘗試先(按名稱)分組,然後再減少每個組。一個可能的實現將是這樣的,你首先進行分組,然後將每個分組映射到一個減少操作,積累分數並附加場地。

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: [] }); 
}); 
1

相反的reduce,試圖以這種方式使用簡單明瞭的each

_.each承認對情境的第三個參數。因此,舉例來說:

var input = ["Alice", "Bob", "Charlie"]; 
var context = {}; 

_.each(input, function(o,i) { this[i] = o; }, context); 

console.log(context) //=> {1: "Alice", 2: "Bob", 3: "Charlie"} 

Ruby有一個新的方法調用each_with_object類似於減少,準確的模式,其中備忘錄並不一定是價值迴歸(其實,我的功能不返回任何東西!);但下劃線簡化了它的API設計,只是將該函數的上下文作爲第三個參數。

你可以使用減少,但你需要每次都返回備忘錄,使它不那麼優雅恕我直言。