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

幫你精通JS: 函數式array.forEach的8個案例

開發 前端
JavaScript是當今流行語言中對函數式編程支持最好的編程語言。我們繼續構建函數式編程的基礎,接下來,我們將學習更加通用的函數式迭代方法 array.forEach()。

[[387134]]

 JavaScript是當今流行語言中對函數式編程支持最好的編程語言。我們繼續構建函數式編程的基礎,在前文中分解介紹了幫助我們組織思維的四種方法,分別為:

- array.reduce方法 幫你精通JS:神奇的array.reduce方法的10個案例

- array.map方法 幫你精通JS:神奇的array.map的6個案例

- array.flat方法,以及array.flatMap 幫你精通JS: array.flat與flatMap用法指南

以上四種方法的共同點都是對array作轉換和變形,而且都不需要陷入到瑣碎loop實現細節的 dirty details之中。

接下來,我們將學習更加通用的函數式迭代方法 array.forEach()。

一句話概括區分 forEach 與 map 的區別,pure-function 就用 map,impure-function 則用 forEach。

array.forEach() 語法概述

forEach() 方法對數組的每個元素執行一次給定的函數。

  1. const array1 = ['a''b''c']; 
  2.  
  3. array1.forEach(element => console.log(element)); 
  4.  
  5. // expected output"a" 
  6. // expected output"b" 
  7. // expected output"c" 

 參數

callback

為數組中每個元素執行的函數,該函數接收一至三個參數:

- currentValue 數組中正在處理的當前元素。

- index 可選 數組中正在處理的當前元素的索引。

- array 可選 forEach() 方法正在操作的數組。

thisArg 可選 可選參數。當執行回調函數 callback 時,用作 this 的值。

返回值

undefined。

array.forEach() 描述

forEach() 方法按升序為數組中含有效值的每一項執行一次 callback 函數,那些已刪除或者未初始化的項將被跳過(例如在稀疏數組上)。

可依次向 callback 函數傳入三個參數:

  1. 數組當前項的值
  2. 數組當前項的索引
  3. 數組對象本身

如果 thisArg 參數有值,則每次 callback 函數被調用時,this 都會指向 thisArg 參數。如果省略了 thisArg 參數,或者其值為 null 或 undefined,this 則指向全局對象。按照函數觀察到 this 的常用規則,callback 函數最終可觀察到 this 值。

forEach() 遍歷的范圍在第一次調用 callback 前就會確定。調用 forEach 后添加到數組中的項不會被 callback 訪問到。如果已經存在的值被改變,則傳遞給 callback 的值是 forEach() 遍歷到他們那一刻的值。已刪除的項不會被遍歷到。如果已訪問的元素在迭代時被刪除了(例如使用 shift()),之后的元素將被跳過——參見下面的示例

forEach() 為每個數組元素執行一次 callback 函數;與 map() 或者 reduce() 不同的是,它總是返回 undefined 值,并且不可鏈式調用。其典型用例是在一個調用鏈的最后執行副作用(side effects,函數式編程上,指函數進行 返回結果值 以外的操作)。

forEach() 被調用時,不會改變原數組,也就是調用它的數組(盡管 callback 函數在被調用時可能會改變原數組)。(此處說法可能不夠明確,具體可參考EMCA語言規范:'forEach does not directly mutate the object on which it is called but the object may be mutated by the calls to callback function.',即 forEach 不會直接改變調用它的對象,但是那個對象可能會被 callback 函數改變。)

注意: 除了拋出異常以外,沒有辦法中止或跳出 forEach() 循環。如果你需要中止或跳出循環,forEach() 方法不是應當使用的工具。

若你需要提前終止循環,你可以使用:

  • 一個簡單的 for 循環
  • for...of / for...in 循環
  • Array.prototype.every()
  • Array.prototype.some()
  • Array.prototype.find()
  • Array.prototype.findIndex()

這些數組方法則可以對數組元素判斷,以便確定是否需要繼續遍歷:

  • every()
  • some()
  • find()
  • findIndex()

只要條件允許,也可以使用 filter() 提前過濾出需要遍歷的部分,再用 forEach() 處理。

案例 01 不對未初始化的值進行任何操作(稀疏數組)

如你所見,3 和 7 之間空缺的數組單元未被 forEach() 調用 callback 函數,或進行任何其他操作。

  1. const arraySparse = [1,3,,7]; 
  2. let numCallbackRuns = 0; 
  3.  
  4. arraySparse.forEach(function(element){ 
  5.   console.log(element); 
  6.   numCallbackRuns++; 
  7. }); 
  8.  
  9. console.log("numCallbackRuns: ", numCallbackRuns); 
  10.  
  11. // 1 
  12. // 3 
  13. // 7 
  14. // numCallbackRuns: 3 

 案例 02 將 for 循環轉換為 forEach

  1. const items = ['item1''item2''item3']; 
  2. const copy = []; 
  3.  
  4. // before 
  5. for (let i=0; i<items.length; i++) { 
  6.   copy.push(items[i]); 
  7.  
  8. // after 
  9. items.forEach(function(item){ 
  10.   copy.push(item); 
  11. }); 

 案例 03 打印出數組的內容

注意:為了在控制臺中顯示數組的內容,你可以使用 console.table() 來展示經過格式化的數組。下面的例子則是另一種使用 forEach() 的格式化的方法。

下面的代碼會為每一個數組元素輸出一行記錄:

  1. function logArrayElements(element, index, array) { 
  2.   console.log('a[' + index + '] = ' + element); 
  3.  
  4. // 注意索引 2 被跳過了,因為在數組的這個位置沒有項 
  5. [2, 5, , 9].forEach(logArrayElements); 
  6. // logs: 
  7. // a[0] = 2 
  8. // a[1] = 5 
  9. // a[3] = 9 

 案例 04 使用 thisArg

舉個勉強的例子,按照每個數組中的元素值,更新一個對象的屬性:

  1. function Counter() { 
  2.   this.sum = 0; 
  3.   this.count = 0; 
  4. Counter.prototype.add = function(array) { 
  5.   array.forEach(function(entry) { 
  6.     this.sum += entry; 
  7.     ++this.count
  8.   }, this); 
  9.   // ^---- Note 
  10. }; 
  11.  
  12. const obj = new Counter(); 
  13. obj.add([2, 5, 9]); 
  14. obj.count
  15. // 3 === (1 + 1 + 1) 
  16. obj.sum
  17. // 16 === (2 + 5 + 9) 

 因為 thisArg 參數(this)傳給了 forEach(),每次調用時,它都被傳給 callback 函數,作為它的 this 值。

注意:如果使用箭頭函數表達式來傳入函數參數, thisArg 參數會被忽略,因為箭頭函數在詞法上綁定了 this 值。

案例 05 對象復制器函數

下面的代碼會創建一個給定對象的副本。 創建對象的副本有不同的方法,以下是只是一種方法,并解釋了 Array.prototype.forEach() 是如何使用 ECMAScript 5 Object.* 元屬性(meta property)函數工作的。

  1. function copy(obj) { 
  2.   const copy = Object.create(Object.getPrototypeOf(obj)); 
  3.   const propNames = Object.getOwnPropertyNames(obj); 
  4.  
  5.   propNames.forEach(function(name) { 
  6.     const desc = Object.getOwnPropertyDescriptor(obj, name); 
  7.     Object.defineProperty(copy, namedesc); 
  8.   }); 
  9.  
  10.   return copy; 
  11.  
  12. const obj1 = { a: 1, b: 2 }; 
  13. const obj2 = copy(obj1); // 現在 obj2 看起來和 obj1 一模一樣了 

 案例 06 如果數組在迭代時被修改了,則其他元素會被跳過。

下面的例子會輸出 "one", "two", "four"。當到達包含值 "two" 的項時,整個數組的第一個項被移除了,這導致所有剩下的項上移一個位置。因為元素 "four" 正位于在數組更前的位置,所以 "three" 會被跳過。 forEach() 不會在迭代之前創建數組的副本。

  1. var words = ['one''two''three''four']; 
  2. words.forEach(function(word) { 
  3.   console.log(word); 
  4.   if (word === 'two') { 
  5.     words.shift(); 
  6.   } 
  7. }); 
  8. // one 
  9. // two 
  10. // four 

 案例 07 扁平化數組

下面的示例僅用于學習目的。如果你想使用內置方法來扁平化數組,你可以考慮使用 Array.prototype.flat()(預計將成為 ES2019 的一部分,并且已在主要瀏覽器中實現)或參考其 polyfill。

  1. /** 
  2.  * Flattens passed array in one dimensional array 
  3.  * 
  4.  * @params {array} arr 
  5.  * @returns {array} 
  6.  */ 
  7. function flatten(arr) { 
  8.   const result = []; 
  9.  
  10.   arr.forEach((i) => { 
  11.     if (Array.isArray(i)) 
  12.       result.push(...flatten(i)); 
  13.     else 
  14.       result.push(i); 
  15.   }) 
  16.  
  17.   return result; 
  18.  
  19. // Usage 
  20. const problem = [1, 2, 3, [4, 5, [6, 7], 8, 9]]; 
  21.  
  22. flatten(problem); // [1, 2, 3, 4, 5, 6, 7, 8, 9] 

 案例08 針對 promise 或 async 函數的使用備注

如果使用 promise 或 async 函數作為 forEach() 等類似方法的 callback 參數,最好對造成的執行順序影響多加考慮,否則容易出現錯誤。

  1. let ratings = [5, 4, 5]; 
  2.  
  3. let sum = 0; 
  4.  
  5. let sumFunction = async function (a, b) { 
  6.     return a + b; 
  7.  
  8. ratings.forEach(async function(rating) { 
  9.     sum = await sumFunction(sum, rating); 
  10. }) 
  11.  
  12. console.log(sum); 
  13. // Expected output: 14 
  14. // Actual output: 0 

 【編輯推薦】

 

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

2021-03-14 08:12:02

函數JavaScript語言

2021-03-17 06:03:41

函數式編程JavaScriptarray.filte

2025-03-17 08:30:00

JavaScript循環代碼

2021-03-05 07:45:59

JSreducemap

2021-04-08 09:14:24

js前端函數

2021-07-01 09:43:44

Python函數參數

2019-10-15 09:05:07

域插槽組件前端

2020-12-22 14:11:45

JS forEach()map()

2018-06-19 14:52:52

2012-05-09 09:49:57

移動支付

2025-03-27 10:03:17

PythonPandas代碼

2024-01-16 12:19:08

MySQL重要機制高并發

2022-03-14 09:25:58

B 端UI信息密度

2011-03-30 13:03:14

數據庫營銷

2021-04-07 08:03:51

js舉起Hoisting初始化

2025-04-24 10:20:00

2020-03-12 14:40:59

Python表格命令行

2011-03-31 11:15:52

網頁設計Web

2016-11-28 08:56:15

透析大數據核心

2017-11-10 09:30:43

Linux系統啟動故障修復
點贊
收藏

51CTO技術棧公眾號

欧美视频日韩视频| 精品一区久久久| 在线视频婷婷| 国产欧美久久久精品影院| 日韩av在线一区二区三区| 日韩av大片| 9.1国产丝袜在线观看| 成人激情综合| 亚洲激情久久久| 成人动漫在线播放| 五月天精品一区二区三区| 99热在线免费| 国产欧美日韩亚州综合 | 2019av中文字幕| 欧美视频第一| 一本大道亚洲视频| 电影亚洲精品噜噜在线观看| 精品女同一区二区| 欧美人与禽性xxxxx杂性| 欧美日韩黄色影视| 久久这里精品| 色天使色偷偷av一区二区 | 成人性色生活片| 裸体裸乳免费看| 久久97超碰国产精品超碰| 视频在线一区二区三区| 久久综合婷婷| 亚洲日本精品| 国产一区二区三区不卡在线观看| 国产手机视频在线观看| 国产精品123区| 国产一区二区在线视频播放| 91蜜桃在线免费视频| 精品久久久久久中文字幕2017| 国产日产欧产精品推荐色| 韩国av电影免费观看| 亚洲一区二区视频在线| 三级视频在线| 欧美一区二区视频网站| 182在线视频观看| 正在播放亚洲1区| 精品视频在线播放一区二区三区| 久久久久一本一区二区青青蜜月| 一本久久青青| 成人欧美一区二区三区在线观看| 先锋影音国产一区| 国产又粗又硬又长| 久久久久亚洲蜜桃| 日本欧洲一区| 4438成人网| 97人人做人人爽香蕉精品| 欧美乱妇40p| 99久久www免费| 狠狠久久综合婷婷不卡| 激情综合色播激情啊| 北条麻妃在线视频| 日韩欧美中文字幕在线观看| 日日夜夜天天综合入口| 色吧影院999| 97精品97| 青青在线免费视频| 一区二区三区在线视频免费| 视频免费一区| 久久久精品久久久久| 国产一区二区精品久| 欧美色欧美亚洲另类七区| 成人av网站免费观看| 色播在线观看| 亚洲男人天天操| 色狠狠久久av综合| 日本在线视频一区| 国产日韩av一区二区| 成人综合影院| 久久中文精品视频| 亚洲日本激情| 美女网站免费观看视频| 欧美吞精做爰啪啪高潮| 日韩黄色三级在线观看| 亚洲精品欧美日韩专区| 成人综合激情网| 亚洲欧洲成人| 色婷婷综合久久久久| 欧美1区2区视频| 国产日产欧美视频| 欧美裸体一区二区三区| 伦理一区二区| 国产一二三四五| 色哟哟日韩精品| 亚洲精品一区二区三区在线| 久久精品国产一区二区三区日韩 | 亚洲欧美日韩在线高清直播| 精品国产91| 黄色三级中文字幕| 一本到一区二区三区| 日韩欧国产精品一区综合无码| 亚洲伊人一本大道中文字幕| 久久久久久一二三区| 91小视频xxxx网站在线| 热久久这里只有| caoporn国产精品| 日本动漫同人动漫在线观看| 国产精品美女呻吟| 国产亚洲一区二区在线观看| 黄色网址视频在线观看| 国产精品麻豆va在线播放| 91麻豆国产在线观看| 视频在线这里都是精品| 国产日本欧美视频| 国产精品国产三级国产aⅴ入口 | 成人激情综合网站| h网站久久久| 成人免费在线视频网站| 久久久久久久久久久电影| wwww在线观看免费视频| 国产精品一区二区三区在线观| 中文字幕在线不卡一区| xxxxx.日韩| 黄瓜视频免费观看在线观看www| 日韩欧美aⅴ综合网站发布| 欧美日韩一区二区三区四区不卡 | 亚洲国产精品系列| 99这里有精品| 你懂的在线播放| 国产精品三级网站| 中文字幕一区二区三区不卡| 日韩成人免费av| 996这里只有精品| 日韩亚洲电影在线| 亚洲午夜伦理| 福利成人在线观看| 91精品免费| 疯狂做受xxxx高潮欧美日本| 欧美人与牛zoz0性行为| 涩涩视频免费网站| 欧美性受xxxx黑人猛交| 中文一区一区三区高中清不卡| 91麻豆精品国产91久久久更新资源速度超快| 亚洲午夜精品久久| 欧美精品一区二区三区四区| 久久av一区| 黄色影院在线看| 一区二区三区四区视频在线观看| 日韩一区二区中文字幕| 久久综合中文| 中文字幕在线高清| 国内精品在线观看视频| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 国产精品久久免费看| 精品国产一区二| 午夜精品久久久久久久无码| 日韩视频在线免费观看| 久久久久国产精品麻豆ai换脸| 日韩成人18| 成全视频全集| 国产精品久久久久久一区二区| 亚洲成av人在线观看| 亚洲精品国产首次亮相| av影片免费在线观看| 欧美一区二区三区电影在线观看 | 日韩欧美中文字幕一区| 日韩极品在线观看| 成人看片网站| 妺妺窝人体色www在线观看| 欧美亚洲日本网站| 午夜电影一区二区三区| 国产精品地址| 超级白嫩亚洲国产第一| 免费看黄在线看| 日本成人在线视频网址| 欧美色区777第一页| 美女在线观看视频一区二区| abab456成人免费网址| 中文字幕第21页| 国产精品嫩草视频| 欧美精品粉嫩高潮一区二区| 毛片av一区二区| 国产精选久久| 天堂91在线| 一区二区视频在线免费| 欧美精品久久久久久久免费观看 | 国产视频久久久久| 一区二区网站| 波多野结衣av在线| 狼狼综合久久久久综合网| 国产一区二区动漫| 亚洲手机成人高清视频| 99国产精品久久久久久久成人热| videos性欧美另类高清| 国产va在线观看| 日本一区二区精品| 久久免费精品视频| 欧美日韩亚洲综合在线| av在线播放成人| 婷婷综合社区| 黑人巨大精品| 中文日本高清免费| www亚洲国产| 国产精品福利在线观看| 日韩高清欧美高清| 一本大道综合伊人精品热热|