整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          面試官:小伙子,你的數組去重方式驚艷到我了

          面試官:小伙子,你的數組去重方式驚艷到我了

          題開始,數組去重,即從一個數組中移除所有重復的元素,確保每個元素只出現一次,是這一類問題的核心。

          使用原生 JavaScript 方法

          1. filter() 方法配合 indexOf()

          const uniqueArray=array.filter((item, index, self)=> {
            return self.indexOf(item)===index;
          });

          該方法利用 filter() 遍歷數組,對于每個元素,通過 indexOf() 查找其在原數組中的第一個索引。如果當前元素的索引與正在遍歷的索引相同,說明這是該元素在數組中的首次出現,保留該元素;否則,忽略該元素。

          2. reduce() 方法

          const uniqueArray=array.reduce((acc, current)=> {
            return acc.includes(current) ? acc : [...acc, current];
          }, []);

          這里使用 reduce() 函數將數組累積到一個新的數組(acc)中。在每次迭代中,檢查當前元素是否已存在于累積數組中。若不存在,則將其添加至累積數組;否則,跳過該元素。

          利用 ES6 新特性

          1. 使用擴展運算符與解構賦值

          const uniqueArray=[...new Set(array)];

          這種方法簡潔高效,利用 ES6 的 Set 數據結構自動去除重復元素的特性,再通過擴展運算符將 Set 轉換回數組。Set 是一種特殊的集合,不允許重復元素存在,因此插入過程會自動過濾重復項。

          2. 利用 Map 數據結構

          const uniqueArray=Array.from(new Map(array.map(item=> [item, item])).values());

          盡管不如直接使用 Set 直觀,但此方法同樣有效。它首先將數組映射為鍵值對相同的 Map,由于 Map 鍵的唯一性,重復的數組元素會被自動忽略。然后通過 Array.from()Map.values()Map 的值(即無重復元素)轉換回數組。

          雙重循環與哈希表

          1. 雙重循環

          const uniqueArray=[];
          for (let i=0; i < array.length; i++) {
            let isDuplicate=false;
            for (let j=0; j < i; j++) {
              if (array[i]===array[j]) {
                isDuplicate=true;
                break;
              }
            }
            if (!isDuplicate) {
              uniqueArray.push(array[i]);
            }
          }

          這種方法最直觀也最基礎,通過外層循環遍歷數組,內層循環檢查當前元素是否與之前的所有元素重復。如果沒有重復,則將其添加到結果數組中。雖然理解簡單,但時間復雜度較高,不適用于大型數據集。

          2. 利用對象作為哈希表

          const uniqueArray=[];
          const hashTable={};
          for (let i=0; i < array.length; i++) {
            const item=array[i];
            if (!hashTable[item]) {
              uniqueArray.push(item);
              hashTable[item]=true;
            }
          }

          這種方法利用對象作為哈希表,以數組元素作為鍵。在遍歷過程中,若元素尚未作為對象的鍵存在,則添加到結果數組并將其設置為哈希表的鍵。由于對象屬性查找的時間復雜度接近 O(1),這種方法在處理大量數據時比雙重循環更為高效。

          性能比較與優化策略

          1. 性能比較

          • filter() + indexOf():線性時間復雜度 O(n^2),適合小型數據集。
          • reduce():線性時間復雜度 O(n^2),適合小型數據集。
          • 擴展運算符與 Set:近乎線性時間復雜度 O(n),非常高效,適合各種規模的數據集。
          • Map:近乎線性時間復雜度 O(n),非常高效,適合各種規模的數據集。
          • 雙重循環:平方時間復雜度 O(n^2),效率低,僅適用于極小數據集。
          • 哈希表:近乎線性時間復雜度 O(n),高效,適合各種規模的數據集。

          2. 優化策略

          • 選擇合適的方法:根據數據規模和項目需求,優先考慮使用 SetMap 或哈希表方法,它們具有更高的時間效率。
          • 預處理數據:如果可能,提前對數據進行排序或轉換,簡化去重邏輯,提高效率。
          • 懶加載與分批處理:對于超大規模數據,可采用懶加載或分批處理策略,避免一次性加載全部數據導致的性能瓶頸。
          • 使用 Web Worker:對于計算密集型的去重操作,可以考慮使用 Web Worker 進行多線程處理,避免阻塞主線程影響用戶體驗。

          ilter

          let arr=["頭條", "頭條", "頭條", "plzbefat", "plzbefat", "plzbefat"];
          let arrUnique=arr.filter((v, i, self)=> self.indexOf(v)===i); //過濾掉已經存在的值
          console.log(arrUnique);

          ES6 set函數(值的集合)

          let arr=["頭條", "頭條", "頭條", "plzbefat", "plzbefat", "plzbefat"];
          let arrUnique=[...new Set(arr)];//值的集合 不能重復
          console.log(arrUnique);

          關于set函數:

          Set 對象允許你存儲任何類型的唯一值,無論是原始值或者是對象引用。

          已知如下數組:
          var arr=[ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
          編寫一個程序將數組扁平化去并除其中重復部分數據,最終得到一個升序且不重復的數組
          

          組實例的 flat(),flatMap()

          數組的成員有時還是數組,Array.prototype.flat()用于將嵌套的數組“拉平”,變成一維的數組。該方法返回一個新數組,對原數據沒有影響。

          上面代碼中,原數組的成員里面有一個數組,flat()方法將子數組的成員取出來,添加在原來的位置。

          flat()默認只會“拉平”一層,如果想要“拉平”多層的嵌套數組,可以將flat()方法的參數寫成一個整數,表示想要拉平的層數,默認為1

          上面代碼中,flat()的參數為2,表示要“拉平”兩層的嵌套數組。

          如果不管有多少層嵌套,都要轉成一維數組,可以用Infinity關鍵字作為參數。

          如果原數組有空位,flat()方法會跳過空位

          flatMap()方法對原數組的每個成員執行一個函數(相當于執行Array.prototype.map()),然后對返回值組成的數組執行flat()方法。該方法返回一個新數組,不改變原數組。

          flatMap()方法的參數是一個遍歷函數,該函數可以接受三個參數,分別是當前數組成員、當前數組成員的位置(從零開始)、原數組。

          然后,我們來看看文章開始的那道題目如何優雅的求解

          如果你還有好的方法,歡迎在下面留言,我會補充上去,供大家學習參考

          參考文章:

          https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/8


          主站蜘蛛池模板: 亚洲国产欧美一区二区三区| 手机福利视频一区二区| 一区二区三区久久精品| 久久久无码精品国产一区| 亚洲色偷精品一区二区三区| 中文字幕一区二区三区视频在线| 亚洲码欧美码一区二区三区| 手机看片一区二区| 尤物精品视频一区二区三区 | 中文字幕一区二区三区精彩视频| 精品一区二区三区在线视频观看| 国产成人精品日本亚洲专一区 | 蜜臀AV无码一区二区三区| 国产精品视频一区二区噜噜| 一区二区三区在线播放视频| 国内精品一区二区三区最新| 国产精品高清一区二区人妖| 精品国产一区二区三区免费| 国产婷婷一区二区三区| 丝袜美腿高跟呻吟高潮一区| 国模视频一区二区| 色一情一乱一区二区三区啪啪高| 精品少妇一区二区三区视频| 亚洲一区视频在线播放| 国产精品香蕉一区二区三区| 骚片AV蜜桃精品一区| 亚洲国产一区视频| 国模无码一区二区三区| 亚洲爆乳精品无码一区二区| 无码午夜人妻一区二区三区不卡视频| 成人国产精品一区二区网站| 国产一区二区视频在线播放| 正在播放国产一区| 成人精品视频一区二区| 在线一区二区三区| 国产精品无码一区二区三区在| 国产萌白酱在线一区二区| 天美传媒一区二区三区| 亚洲第一区二区快射影院| 亚洲日本精品一区二区| 久久精品国产第一区二区三区|