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