摘要:一個初學(xué)者啦想要記錄一下遇到的小問題。返回值存入,接著進(jìn)行第二次迭代。返回迭代結(jié)束后的結(jié)果。這是高級程序設(shè)計上面介紹的。參數(shù)是數(shù)組中的第一個元素的值。再補充一點的每一次遞歸必須要有返回值,否則會出錯這一點也有相似性質(zhì)
1.Array#sort一個js初學(xué)者啦~想要記錄一下遇到的小問題。也希望和大家交流。
Array#sort方法在沒有指定參數(shù)的情況下,是執(zhí)行的是字符串的比較。如下列代碼
[0,-1,-2].sort();//=>[-1,-2,0]
和我們預(yù)想的并不一致啊,既不是從小到大也不是從大到小。這是因為javascript的sort方法是將數(shù)字轉(zhuǎn)換成字符串再檢查。即先檢查負(fù)號,然后1<2,故排列為-1,-2,0,和我們預(yù)期的并不一樣。正確的寫法如下(即需要傳入一個用于比較的函數(shù)):
[-1,-2,0].sort(function(x,y){ return x-y;//從小到大 //return y-x; //從大到小 //或者是 return x<=y; })2.關(guān)于reduce的用法
Array.reduce()是可以傳入兩個參數(shù),用于處理每一項的函數(shù)和迭代的初始值(可選)?;A(chǔ)的用法一般是用于求數(shù)組的和,這也是javascript高級程序設(shè)計書中的例子:
var values = [1,2,3,4,5]; var sum = values.reduce( function(prev,cur,index,array){ return prev+cur; }); console.log(sum);//15
其實也可以在reduce函數(shù)的第二個參數(shù)上加一個迭代初始值0,這里應(yīng)該是默認(rèn)是0了。迭代過程如下:
prev=1,cur = 2,然后prev+cur=3,返回結(jié)果。
返回值存入prev,接著進(jìn)行第二次迭代。
接著進(jìn)行下一次迭代直至迭代完。
返回迭代結(jié)束后的結(jié)果。
這是javascript高級程序設(shè)計上面介紹的。然而我寫了一個測試的代碼。
function reduceFunc(arr){ arr.reduce(function(prev,cur,index,array){ console.log(arguments); return prev+cur; },0); }
就是增加了一句打印每次迭代參數(shù),而且initialValue給定了0的值。發(fā)現(xiàn)第一次的prev是0,可是第一個值應(yīng)該是1對不對。javascript高級程序設(shè)計(第三版)中98頁寫道“第一次迭代發(fā)生在數(shù)組的第二項上,因此第一個參數(shù)是數(shù)組的第一項,第二個參數(shù)就是數(shù)組的第二項”。所以是書本有錯嗎?不盡然。我查到MSDN關(guān)于reduce的介紹。是這樣解釋這個問題的:
第一次執(zhí)行回調(diào)函數(shù)時:
如果向 reduce 方法提供 initialValue:
prev 參數(shù)為 initialValue。
cur 參數(shù)是數(shù)組中的第一個元素的值。
如果未提供 initialValue:
prev 參數(shù)是數(shù)組中的第一個元素的值。
cur 參數(shù)是數(shù)組中的第二個元素的值。
一般情況下迭代的初始值不需要寫,也就是
reduce(function(){ // });
這樣用即可,但是如果存儲每次迭代結(jié)果的是一個數(shù)組的話就不能這樣啦。今天看到一個比較高級一點的用法。就是迭代結(jié)果是數(shù)組,先貼代碼
var str = "name,age,hair Merble,35,red Bob ,64, blonde"; function lameCSV(str){ return str.split(" ").reduce(function(table,row,index,array){ console.log(index); table.push(row.split(",").map(function(c){ return c.trim(); }) ); return table; }, []); }
代碼大致就是實現(xiàn)一個把字符串解析成數(shù)組的形式。這里prev寫的是table。如果說沒有倒數(shù)第二行設(shè)置為空數(shù)組的話,table.push()是會報錯的。因為如上文所說,如果不指定迭代初始值的話,第一次迭代prev(也就是table)的取值是1。顯然1是沒有Push方法的。
再來具體說說這個函數(shù)。
1. row每次分割之后返回trim()之后的值,table再將其push進(jìn)去。 2. 接著返回table數(shù)組作為新一輪的迭代初值。進(jìn)行下一行的迭代。 3. 然后reduce函數(shù)內(nèi)的return語句會把table迭代結(jié)束的結(jié)果返回出來。函數(shù)運行結(jié)束。再補充一點
reduce的每一次遞歸必須要有返回值,否則會出錯
var arr = [1,2,3,4]; function Process(prev,cur){ if(prev!=3){ return prev+cur; } } arr.reduce(Process);//NaN
這一點map也有相似性質(zhì)
function mapFunc(value){ if(value!=2){return value;} } arr.map(mapFunc);//undefined
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/80550.html
摘要:因為工作中一直在使用,也一直以來想總結(jié)一下自己關(guān)于的一些知識經(jīng)驗。于是把一些想法慢慢整理書寫下來,做成一本開源免費專業(yè)簡單的入門級別的小書,提供給社區(qū)。本書的后續(xù)可能會做成視頻版本,敬請期待。本作品采用署名禁止演繹國際許可協(xié)議進(jìn)行許可 React.js 小書 本文作者:胡子大哈本文原文:React.js 小書 轉(zhuǎn)載請注明出處,保留原文鏈接以及作者信息 在線閱讀:http://huzi...
摘要:前言是一門非常靈活的語言,實際的開發(fā)過程中我們也可以靈活的使用它而給我們的工作帶來便利,這篇文章記錄了自己平時學(xué)習(xí)過程中經(jīng)常用到的一些小技巧,整理出來作為筆記,也希望對感興趣的同學(xué)有所幫助。 前言 javascript是一門非常靈活的語言,實際的開發(fā)過程中我們也可以靈活的使用它而給我們的工作帶來便利,這篇文章記錄了自己平時學(xué)習(xí)過程中經(jīng)常用到的一些小技巧,整理出來作為筆記,也希望對感興趣...
摘要:導(dǎo)語公司最近業(yè)務(wù)不忙,利用閑暇時間準(zhǔn)備學(xué)習(xí)一下,看見網(wǎng)上前端大牛張旭鑫的文章一般般的網(wǎng)頁重構(gòu)可以使用做些什么,跟著寫了一下批量修改文件名的小工具,主要利用的中相關(guān)方法來實現(xiàn)記錄一下,以備后用。 導(dǎo)語:公司最近業(yè)務(wù)不忙,利用閑暇時間準(zhǔn)備學(xué)習(xí)一下Node.js,看見網(wǎng)上前端大牛張旭鑫的文章JS一般般的網(wǎng)頁重構(gòu)可以使用Node.js做些什么?,跟著寫了一下批量修改文件名的javascript...
摘要:行勝于言,理論結(jié)合實踐才是王道,所以本文我將基于前面的學(xué)習(xí)方法,分享我是如何學(xué)習(xí)微信小程序的。第二個目標(biāo)則需要學(xué)習(xí)小程序的插件相關(guān)接口調(diào)用,以及蟬知建站系統(tǒng)這邊的微信模塊代碼。 前段時間和大家一起分享了一篇關(guān)于學(xué)習(xí)方法內(nèi)容《大牛與搬運工的差距——學(xué)習(xí)方法的力量》。我們將學(xué)習(xí)過程分成八步,并借鑒了敏捷開發(fā)的迭代思想,以達(dá)到自我迭代學(xué)習(xí)的效果。行勝于言,理論結(jié)合實踐才是王道,所以本文我將基...
摘要:很想一窺源碼,查看究竟,看看大廠的前端大神們是如何規(guī)避了小程序的各種奇葩的坑。頭發(fā)減減可是問題是吶好看的小程序,又獲得不到源代碼。所以啊,才能容易的反編譯出來,如果是那就很難了一鍵獲取微信小程序源代碼 ? 1 Tips: 2 一鍵獲取微信小程序源碼, 使用了C#加nodejs制作 直接解壓在D盤根目錄下后就可以使用 將小程序文件放到 wxapkg目錄下3 這個目錄下有一些demo...
閱讀 2634·2021-11-19 09:56
閱讀 886·2021-09-24 10:25
閱讀 1654·2021-09-09 09:34
閱讀 2211·2021-09-09 09:33
閱讀 1066·2019-08-30 15:54
閱讀 552·2019-08-29 18:33
閱讀 1279·2019-08-29 17:19
閱讀 517·2019-08-29 14:19