国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

幫你精通JS:函數式編程的七件武器之Reduce與Map

開發 前端
JavaScript是當今流行語言中對函數式編程支持最好的編程語言。本篇帶給大家函數式編程的七件武器之reduce與map。

[[385370]]

 JavaScript是當今流行語言中對函數式編程支持最好的編程語言。函數式編程的七個函數分別為:

  1. - reduce() and reduceRight() to apply an operation to a whole array, reducing it to a single result 
  2. - map() to transform one array into another by applying a function to each of its elements 
  3. - flat() to make a single array out of an array of arrays 
  4. - flatMap() to mix together mapping and flattening 
  5. - forEach() to simplify writing loops by abstracting the necessary looping code 

 以及 search 與 selection 的函數:

  1. - filter() to pick some elements from an array 
  2. - find() and findIndex() to search for elements that satisfy a condition 
  3. - A pair of predicates, every() and some(), to check an array for a Boolean test 

 一、array.reduce() 將數列降維至一個值

當我們處理array的時候,總是陷入到無窮盡的loop循環之中,掉入進瑣碎的陷阱,戕害我們的思維和大腦。

reduce的基本工作原理如下:


求數列的和

首先從耳熟能詳的求數列之和起步。

  1. const myArray = [22, 9, 60, 12, 4, 56]; 
  2. const sum = (x, y) => x + y; 
  3. const mySum = myArray.reduce(sum, 0); // 163 

 觀察其運行軌跡:

  1. #+begin_src js :results output 
  2. const myArray = [22, 9, 60, 12, 4, 56]; 
  3. const sumAndLog = (x, y) => { 
  4.  console.log(`${x}+${y}=${x + y}`); 
  5.   return x + y; 
  6. }; 
  7. myArray.reduce(sumAndLog, 0); 
  8.  
  9. #+end_src 
  10.  
  11. #+RESULTS: 
  12. : 0+22=22 
  13. : 22+9=31 
  14. : 31+60=91 
  15. : 91+12=103 
  16. : 103+4=107 
  17. : 107+56=163 

 求均值

有了reduce,我們得以用“描述”的方式,以decalratively的方式求得average:

  1. const average = arr => arr.reduce(sum, 0) / arr.length; 
  2. console.log(average(myArray)); // 27.166667 

 求均值的第二種方法,將length寫到里面:

  1. const average2 = (sum, val, ind, arr) => { 
  2.   sum += val; 
  3.   return ind === arr.length - 1 ? sum / arr.length 
  4.          : sum; //將這作為思考的原材料 
  5. }; 
  6.  
  7. console.log(myArray.reduce(average2, 0)); // 27.166667s 

 更近一步,將average作為固有屬性:

  1. Array.prototype.average = function() { 
  2.   return this.reduce((x, y) => x + y, 0) / this.length; 
  3. }; 
  4.  
  5. let myAvg = [22, 9, 60, 12, 4, 56].average(); // 27.166667 

 單詞計算多個值

雖然 reduce 只能返回單個結果,但是此返回結果卻可以包含多個元素,比如是object。

  1. const average3 = arr => { 
  2.   const sumCount = arr.reduce( 
  3.     (accum, value) => ({sum: value + accum.sumcount: accum.count + 1}), 
  4.     {sum: 0, count: 0} 
  5.   ); 
  6.  
  7.   return sumCount.sum / sumCount.count
  8. }; 
  9.  
  10. console.log(average3([7, 11, 19, 23])); 

 以array的方式改寫:

  1. const average4 = arr => { 
  2.   const sumCount = arr.reduce( 
  3.     (accum, value) => [accum[0] + value, xaccum[1] + 1], 
  4.     [0, 0] 
  5.   ); 
  6.   return sumCount[0] / sumCount[1]; 
  7. }; 
  8.  
  9. console.log(average4(myArray)); // 27.166667 

 從右往左的折疊

工作原理如下圖:


比如 reverse 字符串的常規解決方案為:

  1. const reverseString = str => { 
  2.   let arr = str.split(""); 
  3.   arr.reverse(); 
  4.   return arr.join(""); 
  5. }; 
  6.  
  7. console.log(reverseString("MONTEVIDEO"));  // OEDIVETNOM 

 而reduceRight的解題方案呢,

  1. const reverseString2 = str => 
  2.   str.split("").reduceRight((x, y) => x + y, ""); 
  3.  
  4. console.log(reverseString2("OEDIVETNOM"));  // MONTEVID 

 二、array.map 從數學到編程

map首先是數學上的概念。


從object中提取數據

  1. const markers = [ 
  2.   {name"AR", lat: -34.6, lon: -58.4}, 
  3.   {name"BO", lat: -16.5, lon: -68.1}, 
  4.   {name"BR", lat: -15.8, lon: -47.9}, 
  5.   {name"CL", lat: -33.4, lon: -70.7}, 
  6.   {name"CO", lat:   4.6, lon: -74.0}, 
  7.   {name"EC", lat:  -0.3, lon: -78.6}, 
  8.   {name"PE", lat: -12.0, lon: -77.0}, 
  9.   {name"PY", lat: -25.2, lon: -57.5}, 
  10.   {name"UY", lat: -34.9, lon: -56.2}, 
  11.   {name"VE", lat:  10.5, lon: -66.9}, 
  12. ]; 
  13.  
  14. let averageLat = average(markers.map(x => x.lat)); // -15.76 
  15. let averageLon = average(markers.map(x => x.lon)); // -65.53 
  16. // extended array.prototype 
  17. let averageLat2 = markers.map(x => x.lat).average(); 
  18. let averageLon2 = markers.map(x => x.lon).average(); 

 悄無聲息的處理數據

看一個我們想當然的應用:

  1. ["123.45""67.8""90"].map(parseFloat); 
  2. // [123.45, 67.8, 90] 
  3.  
  4. ["123.45""-67.8""90"].map(parseInt); 
  5. // [123, NaN, NaN] 

 這是因為 parseInt 有一個 optional 的參數 radix。

數列的表示方法

現在我們來創建一個 range.

  1. const range = (start, stop) => 
  2.   new Array(stop - start).fill(0).map((v, i) => start + i); 
  3. // 必須寫一個v,也必須寫 new 
  4. let from2To6 = range(2, 7); // [2, 3, 4, 5, 6] 

 嘗試求乘方:

  1. const range = (start, stop) => 
  2.   new Array(stop - start).fill(0).map((v, i) => start + i); 
  3.  
  4. const factorialByRange = n => range(1, n + 1).reduce((x, y) => x * y, 1); 
  5.  
  6. factorialByRange(5); // 120 
  7. factorialByRange(3); 

 嘗試字母表: 

  1. const ALPHABET = range("A".charCodeAt(), "Z".charCodeAt() + 1).map(x => 
  2.   String.fromCharCode(x) 
  3. ); 
  4.  
  5. // ["A""B""C", ... "X""Y""Z"

 用 reduce 構造 map

reduce是所有其他函數的起點,

  1. const myMap = (arr, fn) => arr.reduce((x, y) => x.concat(fn(y)), []); 

嘗試兩種不同的解決方案:

  1. const myArray = [22, 9, 60, 12, 4, 56]; 
  2. const dup = x => 2 * x; 
  3.  
  4. console.log(myArray.map(dup));    // [44, 18, 120, 24, 8, 112] 
  5. console.log(myMap(myArray, dup)); // [44, 18, 120, 24, 8, 112] 
  6. console.log(myArray);             // [22, 9, 60, 12, 4, 56] 

 【編輯推薦】

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-03-17 06:03:41

函數式編程JavaScriptarray.filte

2021-03-14 08:12:02

函數JavaScript語言

2021-03-12 08:21:54

JavaScript 前端原生js

2021-04-08 09:14:24

js前端函數

2025-04-11 08:00:00

函數式編程Python

2024-08-19 00:01:00

2021-04-07 08:03:51

js舉起Hoisting初始化

2017-06-08 14:25:46

Kotlin函數

2024-12-05 10:37:36

Java純函數final

2024-01-10 08:47:48

Python函數Map()

2025-05-13 08:20:58

2009-12-23 17:10:26

2022-07-07 09:03:36

Python返回函數匿名函數

2021-03-22 06:28:44

reducemap函數

2024-06-04 00:20:00

Python函數

2013-09-09 09:41:34

2009-07-24 17:31:30

C#2.0函數式編程

2012-09-21 09:21:44

函數式編程函數式語言編程

2021-03-24 10:31:10

JS函數式編程前端

2020-12-11 09:38:49

Shell編程開發
點贊
收藏

51CTO技術棧公眾號

亚洲影院理伦片| 国产亚洲精品久久久久久久| 欧美全黄视频| 国产成人三级视频| 亚洲激情男女视频| 天堂中文在线播放| 日韩av黄色在线观看| 玖玖视频精品| 成全视频全集| 国产视频久久久久| 午夜久久免费观看| 男女av免费观看| 3d动漫精品啪啪1区2区免费| 色天天色综合| 97在线免费视频观看| 日本韩国欧美一区| 电影一区二区在线观看| 杨幂一区欧美专区| 一本久久a久久精品亚洲| 伊人久久大香| 日韩免费av电影| 亚洲一区二区免费视频| 亚洲国产91视频| 天堂精品视频| 欧美香蕉大胸在线视频观看| 日本亚洲视频| 中国一级黄色录像| 欧美精品在线一区二区三区| 欧美精美视频| 亚洲乱码国产一区三区| 日韩高清欧美高清| 国产欧美在线| 伊人75在线| 91成人性视频| 久久女同性恋中文字幕| 欧美久久天堂| 日本不卡高清视频一区| 一本一本久久a久久精品综合麻豆| 欧美片网站免费| 亚洲一区二区三区精品在线观看| 91久久精品一区二区| 亚洲69av| 成人性生交免费看| 北条麻妃一区二区三区中文字幕| 久久国产乱子精品免费女| 免费av在线播放| 成人av电影免费| 午夜精品久久久久久久久 | 精品国产一区二区三区四区在线观看| 先锋影音国产一区| 91在线视频| 高清视频一区二区三区| 黑丝美女久久久| 久久网站免费观看| 亚洲精品视频区| 亚洲aa中文字幕| 欧美性高潮在线| 国产精品a级| 无遮挡的视频在线观看| 成人激情av| 欧美在线观看视频在线| 国产一区美女| 免费a级人成a大片在线观看| 欧洲高清一区二区| 精品成人佐山爱一区二区| 蜜臀av亚洲一区中文字幕| 国产h片在线观看| 最新av网址在线观看| 国产一区二区三区中文| av在线综合网| 麻豆精品在线| 免费全黄无遮挡裸体毛片| 国产精品黄色av| 亚洲国产成人av好男人在线观看| 国产一区国产二区国产三区| 中文产幕区在线观看| 亚洲自拍小视频| 欧美精品tushy高清| 免费看欧美女人艹b| 欧美无毛视频| 女人另类性混交zo| 国外成人性视频| 一区二区三区精品视频| 综合精品一区| 性xxxfreexxxx性欧美| 黄色网zhan| 久久99国产精品自在自在app| 亚洲视频一区二区在线| 亚洲啊v在线观看| 最爽无遮挡行房视频在线| 四虎精品欧美一区二区免费| www.日韩av.com| 亚洲女厕所小便bbb| 你懂的网址国产 欧美| av片在线观看永久免费| 丁香六月激情网| 欧美极品美女视频网站在线观看免费| 亚洲黄色av一区| 久久精选视频| 欧美在线在线| 欧美偷拍视频| 欧美日韩一区二区三区电影| 久久男人的天堂| 欧美亚洲愉拍一区二区| 国产福利精品导航| 国产精品嫩草影院在线看| 国产日产一区二区| 37pao成人国产永久免费视频| 国产在线观看精品| 亚洲福利视频久久| 中文字幕日韩精品一区 | 给我免费播放片在线观看| 日韩av电影免费观看高清| 制服.丝袜.亚洲.中文.综合| 91视视频在线直接观看在线看网页在线看| 色婷婷综合久久久久久| 91一区二区三区在线| 精品久久久噜噜噜噜久久图片| 成人黄色中文字幕| 日韩成人在线免费观看| 亚洲美女在线一区| 日本va欧美va瓶| 香蕉久久精品| 福利小视频在线| 日本粉色视频在线观看| 中文字幕在线乱| 国产精品一区二区三区久久| 亚洲天堂一区二区三区| 天天影视涩香欲综合网| 韩国女主播成人在线| 99久久久久| 久久日本片精品aaaaa国产| 成全电影播放在线观看国语| 免费激情视频在线观看| 久久亚裔精品欧美| 91精品国产777在线观看| 亚洲第一区中文99精品| 午夜精品一区二区三区电影天堂 | 国产麻豆精品95视频| 成人免费在线观看av| 欧美男体视频| 国产一二三区在线| 国产精品一区二区羞羞答答| 狼狼综合久久久久综合网| 97激碰免费视频| 日韩大陆毛片av| 色综合天天综合色综合av| 久久综合九色欧美综合狠狠| 噜噜噜躁狠狠躁狠狠精品视频| 国产欧美日韩精品一区二区三区| 亚洲综合在线电影| 国产传媒在线播放| 毛片在线网址播放| 欧美精品第三页| 日本黄色a视频| 国产精品一区视频| 国产精品白丝jk喷水视频一区| 青青草原综合久久大伊人精品优势| 蜜臀久久99精品久久久久宅男| 欧美日韩在线视频一区| 在线91免费看| 在线观看欧美日韩| 亚洲一区二区三区四区视频 | 全部孕妇毛片丰满孕妇孕| 男人日女人视频网站| 91免费在线| 乱一区二区三区在线播放| 欧美大片网站在线观看 | 日韩脚交footjobhd| 成年人在线视频| 91嫩草在线播放| 各处沟厕大尺度偷拍女厕嘘嘘| 一区二区三区av| 久久天天狠狠| 成人性生交大片免费看视频直播| 欧美精品日韩三级| 中文欧美日本在线资源| 亚洲精品色婷婷福利天堂| 欧美日韩国产在线观看| 激情懂色av一区av二区av| 亚洲欧美另类图片小说| 日本一区二区三区免费乱视频| 白白色亚洲国产精品| 国产一二精品视频| 久久福利资源站| 日韩电影在线一区二区三区| 西西裸体人体做爰大胆久久久| 亚洲黄色视屏| 亚洲精品三级| 妖精视频成人观看www| 伊人狠狠色j香婷婷综合| 欧美日韩免费观看一区=区三区| 天堂美国久久| 欧美三级视频| 国产美女一区| 麻豆一区二区三| 国产一区美女在线| 成人18视频在线播放| 久久久综合网站| 亚洲欧美综合色|