2012-09-28 18 views
0

我想了解爲什麼這個函數的作者會調用reduce已經調用映射的結果的對象。這是來自骨幹應用程序的渲染功能(演示http://fire-camp.heroku.com/)。變量「消息」表示用戶進入消息傳遞系統的消息的集合。爲什麼作者會調用map,然後減少map的結果,即'data'。我不明白如何減少添加任何新的數據變量。如果您需要更多信息,請與我們聯繫。JavaScript:reduce和map

render: function() { 
    var data = messages.map(function(message) { return message.get('content') + 'n'}); 
    var result = data.reduce(function(memo,str) { return memo + str }, ''); 
    $("#chatHistory").text(result); 
    return this; 
    } 

很短的應用程序的完整源代碼在這裏,但我不認爲你會需要它。 https://github.com/ryandotsmith/fire-camp

+3

「map」函數返回一個數組; 「減少」將該數組摺疊爲標量。也就是說,代碼的作者應該使用'.join()'。 – Pointy

+0

感謝您的幫助。但是,爲了從某人那裏得到更全面的答案,@pointy的評論只能部分回答這個問題。沒有真正解釋「爲什麼」部分。例如,在應用程序中,如果我將數據變量插入文本(數據),它仍然是一樣的,那麼爲什麼需要減少?或加入這個問題? – BrainLikeADullPencil

+0

對不起,我的錯誤。如果我將數組傳遞給文本,它不起作用。 – BrainLikeADullPencil

回答

1

如@Pointy提到的,作者已經使用reduce 的原因是連接所述陣列成一個字符串(或減少 它爲一個字符串)。正如@Pointy也提到,雖然在這種情況下使用reduce的理由 不是很好。

鑑於GitHub上的代碼,有幾個替代品 更好。考慮到代碼使用Backbone.js的,如果它沿線的這 讀一些 的messages變量指向Backbone.Collection這 代碼會更清楚:

render: function() { 
    var result = messages.pluck('content').join('\n') 
    $("#chatHistory").text(result); 
    return this; 
} 

使用reduce加盟數組字符串是矯枉過正的,並且掩蓋了代碼的意圖。使用map連同 Backbone.Collection只是爲了從模型中拔出特定屬性 也有點模糊了代碼的意圖 。