function countWords(arr) {
return arr.reduce(function(countMap, word) {
countMap[word] = ++countMap[word] || 1 // increment or initialize to 1
return countMap
}, {}) // second argument to reduce initialises countMap to {}
}
這個(gè)函數(shù)解決的是一個(gè)數(shù)組作為參數(shù)傳入,最終return出來的結(jié)果是一個(gè)該數(shù)組內(nèi)字符串的出現(xiàn)次數(shù)組成的對(duì)象,例如:
數(shù)組:var arr = ['apple','pear','apple'];
結(jié)果:
{
apple: 2,
pear: 1
}
其實(shí)我整段都不知道該咋理解,求高手給小弟分步驟解答一下,感謝??!
每次循環(huán)開始前,各變量的值
callback | countMap | word |
---|---|---|
first | {} | apple |
second | {apple: 1} | pear |
third | {apple: 1, pear: 1} | apple |
第三次循環(huán)完成后return的值:
{apple: 2, pear: 1}
reduce,簡單說是一個(gè)累加。第一個(gè)參數(shù)是一個(gè)函數(shù),這個(gè)函數(shù)中第一個(gè)參數(shù)是總和,第二個(gè)參數(shù)是當(dāng)前遍歷的子項(xiàng)。第二個(gè)參數(shù)為初始值。這里是一個(gè){}。
function countWords(arr) {
return arr.reduce(function(countMap, word) {
debugger;
countMap[word] = ++countMap[word] || 1 // increment or initialize to 1
return countMap
}, {}) // second argument to reduce initialises countMap to {}
}
var arr = ['apple','pear','apple'];
countWords(arr)
你需要一個(gè)debugger,以及一個(gè)瀏覽器控制臺(tái),然后再控制臺(tái)去運(yùn)行這段代碼。按F10去看每一句的實(shí)現(xiàn)。
當(dāng)一個(gè)值不存在時(shí),初始為1.第二個(gè)apple,之前初始為1,現(xiàn)在值變成2了。遇到這種問題,自己打斷點(diǎn)最容易理解。
具體請(qǐng)看 reduce 的API介紹。
countMap = {}
countMap['apple'] = ++countMap['apple'] || 1
// word='apple'; countMap: {apple: 1}
countMap['pear'] = ++countMap['pear'] || 1
// word='pear'; countMap: {apple: 1, pear:1}
countMap['apple'] = ++countMap['apple'] || 1
// word='apple'; countMap: {apple: 2, pear:1}
首先拿個(gè)具體的例子來看看這個(gè)函數(shù)是干什么:
countWords(['apple','xiangjiao','juzi','xiangjiao','daodan','daodan','daodan','daodan'])
返回:
{
apple:1,
daodan:4
juzi:1,
xiangjiao:2
}
很明顯,這個(gè)是函數(shù)是用來統(tǒng)計(jì)某個(gè)值在數(shù)組中的出現(xiàn)次數(shù)
的,比如我想計(jì)算apple
在某個(gè)數(shù)組中出現(xiàn)的次數(shù)。
這里是很巧妙的利用來內(nèi)建函數(shù)reduce
來實(shí)現(xiàn)的功能。
然后要理解reduce
是什么,有什么用?
reduce方法有兩個(gè)參數(shù),第一個(gè)參數(shù)是一個(gè)callback,用于針對(duì)數(shù)組項(xiàng)的操作;第二個(gè)參數(shù)則是傳入的初始值,這個(gè)初始值用于單個(gè)數(shù)組項(xiàng)的操作。需要注意的是,reduce方法返回值并不是數(shù)組,而是形如初始值的經(jīng)過疊加處理后的操作。
就拿樓主的例子來說,
function countWords(arr) {
return arr.reduce(function(countMap, word) {
// 位置1
countMap[word] = ++countMap[word] || 1 // increment or initialize to 1
// 位置2
return countMap
}, {}) // second argument to reduce initialises countMap to {}
}
第一次執(zhí)行遍歷的時(shí)候,執(zhí)行到位置1
// 位置1時(shí),各個(gè)參數(shù)的值
countMap = {};
word = 'apple';
執(zhí)行到位置2
的時(shí)候,
// 位置2時(shí),各個(gè)參數(shù)的值
countMap = {apple: 1};
word = 'apple';
以此類推即可。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。