亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

關于JavaScript 數組你應該知道的事情(推薦)

2024-05-06 16:49:46
字體:
來源:轉載
供稿:網友

首先做一個粗體聲明:循環經常是無用的,并且使得代碼很難閱讀。
當談到迭代一個數組的時候,無論你想去查找元素,排序或者任何其他的事,都有可能存在一個數組的方法供你使用。

然而,盡管它們有用,但其中一些仍然不被人了解。我會努力為你展示一些有用的方法。把這篇文章當做對 JavaScript 數組方法的指引吧。

注意: 在開始之前,不得不了解一件事:我比較偏愛函數式編程。所以我傾向于使用的方法不會直接改變原來的數組。這種方法,我避免了副作用。我不是說不應該改變數組,但至少要了解那些方法會改變,那些會有副作用。副作用導致不想要的改變,而不想要的改變帶來bugs!

了解到這里,我們可以開始正文了。

必不可少的
當跟數組打交道時,有四件事你應該清楚:map,filter,reduce 和 展開操作符。它們富有力量。

map

你可以在很多種情況下使用它。基本地,每次你需要修改數組的元素時,考慮使用 map。
它接受一個參數:一個方法,在每一個數組元素上調用。然后返回一個新的數組,所以沒有副作用。

const numbers = [1, 2, 3, 4]const numbersPlusOne = numbers.map(n => n + 1) // 每個元素 +1console.log(numbersPlusOne) // [2, 3, 4, 5]

你也能創建一個新數組,用于保留對象的一個特殊屬性:

const allActivities = [ { title: 'My activity', coordinates: [50.123, 3.291] }, { title: 'Another activity', coordinates: [1.238, 4.292] }, // etc.]const allCoordinates = allActivities.map(activity => activity.coordinates)console.log(allCoordinates) // [[50.123, 3.291], [1.238, 4.292]]

所以,請記住,當你需要去轉換數組時,考慮使用map。

filter

這個方法的名字在這里十分準確的:當你想去過濾數組的時候使用它。
如同map所做,它接受一個函數作為它的唯一參數,在數組的每個元素上調用。這個方法返回一個布爾值:

  1. true 如果你需要在數組中保留元素
  2. false 如果你不想保留它

接著你會得到一個帶有你想要保留的元素的新數組。
舉個例子,你可以在數組中只保留奇數:

const numbers = [1, 2, 3, 4, 5, 6]const oddNumbers = numbers.filter(n => n % 2 !== 0)console.log(oddNumbers) // [1, 3, 5]

或者你可以在數組中移除特殊的項:

const participants = [ { id: 'a3f47', username: 'john' }, { id: 'fek28', username: 'mary' }, { id: 'n3j44', username: 'sam' },]function removeParticipant(participants, id) { return participants.filter(participant => participant.id !== id)}console.log(removeParticipant(participants, 'a3f47')) // [{ id: 'fek28', username: 'mary' }, { id: 'n3j44', username: 'sam' }];

reduce

個人認為是最難理解的方法。但是如果你一旦掌握它,很多瘋狂的事情你都可以用它做到。
基本地, reduce 使用有值的數組然后組合成一個新的值。它接受兩個參數,一個回調方法就是我們的 reducer 和一個可選的初始化的值(默認是數組的第一個項)。這個 reducer 自己使用四個參數:

  1. 累計:在你的 reducer 中累積的返回值
  2. 當前數組的值
  3. 當前索引
  4. 當前調用 reduce 的數組

大多數時候,你只需要使用前兩個參數:累計值和當前值。
拋開這些理論。來看看常見的一個 reduce 的例子。

const numbers = [37, 12, 28, 4, 9]const total = numbers.reduce((total, n) => total + n)console.log(total) // 90

在第一個遍歷時,這個累計值,也就是 total,使用了初始化為 37 的值。它返回的值是 37 + n 并且 n 等于 12,因此得到 49.在第二次遍歷時,累加值是 49,返回值是 49 + 28 = 77。如此繼續直到第四次。

reduce 是很強大的,你可以實際使用它去構建很多數組的方法,比如 map 或者 filter:

const map = (arr, fn) => { return arr.reduce((mappedArr, element) => {  return [...mappedArr, fn(element)] }, [])}console.log(map([1, 2, 3, 4], n => n + 1)) // [2, 3, 4, 5]const filter = (arr, fn) => { return arr.reduce((filteredArr, element) => {  return fn(element) ? [...filteredArr] : [...filteredArr, element] }, [])}console.log(filter([1, 2, 3, 4, 5, 6], n => n % 2 === 0)) // [1, 3, 5]

根本上看,我們給 reduce 一個初始默認值 []:我們的累計值。對于 map,我們運行一個方法,它的結果是累加到最后,多虧了 展開操作符(不必擔心,后面討論)。對于 filter,幾乎是相似的,除了我們在元素上運行過濾函數。如果返回 true,我們返回前一個數組,否則在數組最后添加當前元素。

我們來看一個更高級的例子:深度展開數組,也就是說把 [1, 2, 3, [4, [[[5, [6, 7]]]], 8]] 樣的數組轉換成 [1, 2, 3, 4, 5, 6, 7, 8] 樣的。

function flatDeep(arr) { return arr.reduce((flattenArray, element) => {  return Array.isArray(element)   ? [...flattenArray, ...flatDeep(element)]   : [...flattenArray, element] }, [])}console.log(flatDeep([1, 2, 3, [4, [[[5, [6, 7]]]], 8]])) // [1, 2, 3, 4, 5, 6, 7, 8]

這個例子有點像 map,除了我們用到了遞歸。我不想去解釋這個用法,它超出了這篇文章的范圍。但是,如果你想了解更多的關于遞歸的知識,請參考這篇優質的文章。

展開操作(ES2015)

我知道這不是一個方法。但是,在處理數組時,使用展開操作可以幫助你做很多事情。事實上,你可以在另一個數組中使用它展開一個數組的值。從這一點來說,你可以復制一個數組,或者連接多個數組。

const numbers = [1, 2, 3]const numbersCopy = [...numbers]console.log(numbersCopy) // [1, 2, 3]const otherNumbers = [4, 5, 6]const numbersConcatenated = [...numbers, ...otherNumbers]console.log(numbersConcatenated) // [1, 2, 3, 4, 5, 6]

注意::展開操作符對原數組做了一次淺拷貝。但什么是 淺拷貝?
注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
人体精品一二三区| 亚洲一区二区中文| 亚洲精品永久免费| 欧美国产日韩一区二区三区| 91在线视频一区| 日韩不卡在线观看| 国产精品18久久久久久麻辣| 中文字幕日韩专区| 成人黄色av播放免费| 91产国在线观看动作片喷水| 成人妇女淫片aaaa视频| 热门国产精品亚洲第一区在线| 欧美伦理91i| 日韩精品极品在线观看播放免费视频| 国产欧美日韩免费看aⅴ视频| 96国产粉嫩美女| 亚洲高清色综合| 丁香五六月婷婷久久激情| 久久99青青精品免费观看| 亚洲一区二区在线| 久久99久久99精品免观看粉嫩| 高清一区二区三区四区五区| 97超视频免费观看| 亚洲午夜色婷婷在线| 欧美色道久久88综合亚洲精品| 日韩中文视频免费在线观看| 成人免费看黄网站| 91精品国产91| 成人免费视频网址| 欧美精品激情视频| 69久久夜色精品国产69乱青草| 狠狠躁夜夜躁久久躁别揉| 成人在线视频网站| 欧美国产日韩在线| 日韩有码在线电影| 精品日韩美女的视频高清| 欧美日韩中文在线观看| 亚洲第一区第二区| 国内精品视频一区| 久久久久久中文| 中文字幕久热精品视频在线| 中文字幕亚洲字幕| 亚洲第一精品电影| 亚洲香蕉在线观看| 91精品久久久久久久久久久久久| 日本精品视频在线观看| 日韩成人在线网站| 91av福利视频| 九九热99久久久国产盗摄| 欧美激情欧美激情在线五月| 最新国产精品亚洲| 91影视免费在线观看| 日韩视频在线免费观看| 日韩av综合网| 精品国内亚洲在观看18黄| 中文一区二区视频| 欧美性猛交丰臀xxxxx网站| 97免费视频在线播放| 亚洲图片欧美午夜| 亚洲天堂男人天堂女人天堂| 国内精品国产三级国产在线专| 亚洲精品成人久久久| 欧美精品videos性欧美| 久久综合电影一区| 国产精品网址在线| 91成人福利在线| 亚洲欧美日韩一区二区在线| 亚洲va电影大全| 97久久精品在线| 色综久久综合桃花网| 欧美亚洲日本网站| 日韩视频免费在线| 欧美视频国产精品| 久久精品国产一区| 国产精品吹潮在线观看| 亚洲女同精品视频| 成人精品一区二区三区电影黑人| 久久国产视频网站| 久久国产加勒比精品无码| 国内精品美女av在线播放| 91精品久久久久久久久中文字幕| 亚洲国产日韩欧美在线99| 亚洲精品一区中文字幕乱码| 正在播放欧美视频| 精品久久中文字幕久久av| 国产成人黄色av| 最近2019中文字幕mv免费看| 欧美成人sm免费视频| 欧美日韩另类在线| 欧美性开放视频| 国产精品日韩av| 2019国产精品自在线拍国产不卡| 91亚洲精品久久久| 在线观看91久久久久久| 亚洲精品第一页| 亚洲国产小视频在线观看| 日本高清不卡在线| 国产99久久久欧美黑人| 日韩在线观看免费av| 亚洲国产天堂久久综合| 国产精品激情av电影在线观看| 欧美日韩高清区| 亚洲国产精品va在线| 成人福利网站在线观看11| 成人国产精品一区二区| 国产91精品最新在线播放| 久久国产精彩视频| 日韩精品一区二区三区第95| 欧美日韩亚洲一区二区三区| 91嫩草在线视频| 国内精品久久久久影院 日本资源| 亚洲成人1234| 国产精品国产三级国产aⅴ9色| 国产精品久久久久久久久久尿| 国产欧美 在线欧美| 日韩国产欧美精品在线| 欧美一区二区视频97| 久久综合免费视频| 欧美日韩国产综合新一区| 久久亚洲国产精品| 久久免费高清视频| 亚洲欧美国产精品| 国产精品女视频| 国产免费亚洲高清| 欧美激情一级欧美精品| 亚洲精品电影久久久| 日韩一区二区精品视频| 国产丝袜一区视频在线观看| 国产69精品久久久| 国产精品欧美风情| 欧美一级在线播放| 亚洲影视中文字幕| 成人97在线观看视频| 黄色成人在线播放| 欧美韩国理论所午夜片917电影| 日韩在线免费av| 91视频国产精品| 亚洲视频在线观看| 久久在线精品视频| 亚洲aa在线观看| 日韩中文有码在线视频| 国产精品久久久久久久久久东京| 日韩在线视频一区| 久久欧美在线电影| 久久亚洲一区二区三区四区五区高| 国产精品久久久久久一区二区| 欧美美女操人视频| 最近2019好看的中文字幕免费| 久久99精品视频一区97| 亚洲欧美制服中文字幕| 久久久久久国产精品三级玉女聊斋| 亚洲www在线观看| 国产在线精品成人一区二区三区| 红桃av永久久久| 国产欧美日韩高清| 国产一区玩具在线观看| 午夜精品久久久久久久99热浪潮| 国产精品99久久99久久久二8| 97人人模人人爽人人喊中文字| 国产一区二区日韩| 欧美激情videoshd| 日韩国产精品视频| 精品久久久久久亚洲精品| 亚洲精品视频在线观看视频|