成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

來一個老生常談的話題,JavaScript中,數組如何去重?

開發 前端
關于如何去除一個給定數組中的重復項,應該是 Javascript 面試中最常見的一個問題了,最常見的方式有三種:Set、Array.prototype.filter 以及 Array.prototype.reduce,對于只有簡單數據的數組來講,我最喜歡 Set,沒別的,就是寫起來簡單。

[[274623]]

 關于如何去除一個給定數組中的重復項,應該是 Javascript 面試中最常見的一個問題了,最常見的方式有三種:Set、Array.prototype.filter 以及 Array.prototype.reduce,對于只有簡單數據的數組來講,我最喜歡 Set,沒別的,就是寫起來簡單。

  1. const originalArray = [1, 2, '咩', 1, 'Super Ball''咩''咩''Super Ball', 4] 
  2. const bySet = [...new Set(originalArray)] 
  3. const byFilter = originalArray.filter((item, index) => originalArray.indexOf(item) === index 
  4. const byReduce = originalArray.reduce((unique, item) => unique.includes(item) ? unique : [...unique, item], []) 

使用 Set

先讓我們來看看 Set 到底是個啥

  1. Set 對象允許你存儲任何類型的唯一值,無論是原始值或者是對象引用。 
  2. <cite>https://developer.mozilla.org...</cite> 
  • 首先,Set 中只允許出現唯一值
  • 唯一性是比對原始值或者對象引用

const bySet = [...new Set(originalArray)] 這一段的操作,我們將它拆分來看:

  1. const originalArray = [1, 2, '咩', 1, 'Super Ball''咩''咩''Super Ball', 4]  
  2. const uniqueSet = new Set(originalArray) 
  3. // 得到 Set(5) [ 1, 2, "咩""Super Ball", 4 ] 
  4. const bySet = [...uniqueSet] 
  5. // 得到 Array(5) [ 1, 2, "咩""Super Ball", 4 ] 

在將 Set 轉為 Array 時,也可以使用 Array.from(set)。

使用 Array.prototype.filter

要理解 filter 方法為什么可以去重,需要關注一下另一個方法 indexOf

  1. indexOf()方法返回在數組中可以找到一個給定元素的第一個索引,如果不存在,則返回 -1。 
  2. <cite>https://developer.mozilla.org...</cite> 
  1. const beasts = ['ant''bison''camel''duck''bison']; 
  2. console.log(beasts.indexOf('bison')); 
  3. // expected output: 1 
  4. // start from index 2 
  5. console.log(beasts.indexOf('bison', 2)); 
  6. // expected output: 4 
  7. console.log(beasts.indexOf('giraffe')); 
  8. // expected output: -1 
  1. filter() 方法創建一個新數組, 其包含通過所提供函數實現的測試的所有元素。 
  2. <cite>https://developer.mozilla.org...</cite> 

filter 方法接受兩個參數:

  • 第一個參數:一個回調函數, filter 會將數據中的每一項都傳遞給該函數,若該函數返回 真值,則數據保存,返回 假值,則數據將不會出現在新生成的數據中
  • 第二個參數:回調函數中 this 的指向

我們將上面的去重方法按下面這樣重寫一下,就可以看清整個 filter 的執行過程了。

  1. const originalArray = [1, 2, '咩', 1, 'Super Ball''咩''咩''Super Ball', 4] 
  2. const table = [] 
  3. const byFilter = originalArray.filter((item, index) => { 
  4.   // 如果找到的索引與當前索引一致,則保留該值 
  5.   const shouldKeep = originalArray.indexOf(item) === index 
  6.   table.push({ 
  7.     序號: index
  8.     值: item, 
  9.     是否應該保留: shouldKeep ? '保留' : '刪除' 
  10.   }) 
  11.   return shouldKeep 
  12. })  
  13. console.log(byFilter) 
  14. console.table(table

使用 Array.prototype.reduce

  1. reduce() 方法對數組中的每個元素執行一個由您提供的 reducer 函數(升序執行),將其結果匯總為單個返回值。 
  2. <cite>https://developer.mozilla.org...</cite> 

Array.prototype.reduce 方法接受兩個參數:

  • Callback:回調函數,它可以接收四個參數
  1. Accumulator:累計器,這個其實是讓很多人忽略的一點,就是,累計器其實可以是任何類型的數據
  2. Current Value:當前值
  3. Current Index:當前值的索引
  4. Source Array:源數組
  • Initial Value:累計器的初始值,就跟累計器一樣,這個參數也總是被絕大多數人忽略

就像 filter 章節一樣,我們來看看 reduce 的執行過程:

  1. const originalArray = [1, 2, '咩', 1, 'Super Ball''咩''咩''Super Ball', 4] 
  2. const byReduce = originalArray.reduce((unique, item, index, source) => { 
  3.   const exist = unique.includes(item) 
  4.   const next = unique.includes(item) ? unique : [...unique, item] 
  5.   console.group(`遍歷第 ${index} 個值`) 
  6.   console.log('當前累計器:'unique
  7.   console.log('當前值:', item) 
  8.   console.log('是否已添加進累計器?', exist) 
  9.   console.log('新值'next
  10.   console.groupEnd() 
  11.   return next 
  12. }, []) 

 

責任編輯:華軒 來源: segmentfault
相關推薦

2015-07-21 13:39:58

Javascript作用域

2015-06-25 10:46:23

數據中心節能

2015-04-08 11:50:07

數據加密數據泄露

2014-07-25 13:34:08

2010-07-28 09:09:55

SQL

2012-02-13 09:46:56

數據中心耗能服務器虛擬化

2022-03-08 15:01:48

負載均衡IP服務器

2014-08-21 10:25:44

網絡安全兒童賬戶Google

2011-08-18 14:47:06

2020-01-14 10:37:38

存儲DateTime數值

2021-04-12 09:36:25

Redis擊穿穿透

2021-04-12 09:58:46

Redis數據庫代碼

2017-04-11 13:54:49

HTTPURLHTML

2022-07-28 00:25:22

5G4G速度

2022-05-06 12:01:01

優化小程序

2021-11-26 05:57:12

開源備份Restic

2010-03-29 09:04:51

VB.NET

2024-01-02 09:42:17

C#開發Windows消息循環機制

2010-01-28 13:55:45

三層交換機

2020-11-18 07:52:57

技巧
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产久 | 97av视频在线 | 97精品超碰一区二区三区 | 久草视频在线播放 | 日本精品一区二区三区视频 | 日韩欧美二区 | 中文字幕成人网 | 免费一区二区三区 | 国产精品欧美日韩 | 午夜99| 福利社午夜影院 | 欧美淫片 | 美女黄网 | 国产精品1区| 亚洲aⅴ一区二区 | 亚洲欧美精 | 人妖无码| 久艹av | 欧美国产一区二区 | 日韩中文字幕 | 国产韩国精品一区二区三区 | 国产精品一区二区福利视频 | 一区二区三区四区av | 99精品欧美一区二区三区综合在线 | 欧美黄在线观看 | 日韩中文字幕高清 | 国产男女精品 | 99精品电影| 久久国产精品一区二区 | 麻豆成人在线视频 | 日韩欧美国产精品一区二区 | 在线看91| 国产一级免费视频 | 在线成人av | 伊人色综合久久天天五月婷 | 国产精品18久久久久久白浆动漫 | 色婷婷一区二区三区四区 | 7777精品伊人久久精品影视 | 成人在线免费观看av | 国产午夜精品福利 | 国产yw851.c免费观看网站 |