首頁 web前端 js教程 javascript數組去重方法終極總結_javascript技巧

javascript數組去重方法終極總結_javascript技巧

May 16, 2016 pm 04:46 PM
javascript 數組去重

有時會碰上這種需求,需要將陣列中重複的元素刪除掉,而只保留一個。最先想到的辦法很可能就是用2個for迴圈來做比較然後去除掉重複的元素,程式碼如下圖:

方法1:

複製程式碼 程式碼如下:

Array.prototype.distinct = function(p > var arr = [],
      len = this.length;
 for ( var i = 0; i   for( var j = i 1; j    if( this[i] === this[j ] ){
    j = i;
   }
  }
  arr.push( this[i] );
 }
>; 🎜>

使用方法1如果碰到資料比較多時效能上會差很多。那麼請繼續看下面的方法。
方法2:

複製程式碼

程式碼如下:Array.prototype.distinct = function(p > var self = this,
  arr = self.concat().sort(); // 建立一個新陣列並排序

 arr.sort(function( a, b ){
  if( a === b ){
   var n = self.indexOf( a ); //取得索引值
   self.splice( n, 1 );
   self.splice( n, 1 );
   self.splice( n, 1 );
   self.splice( n, 1 );
  ;

 return self;

};



方法2使用了 sort 的自訂回呼函數,也用到了 indexOf 這個IE6/7/8不支援的方法。當然,indexOf可以自己模擬,但是更大的問題是IE6/7/8的sort方法和標準瀏覽器之間也有差異。在IE6/7/8中使用sort 方法的自訂回呼函數陷阱比較多,上面的自訂sort 的回呼函數的程式碼在IE6/7/8中會直接報「缺少數字」的錯誤,回呼函數的返回是NaN的話就會報這個錯,因為理論上sort 的回呼函數只能回傳整數。就算忽略回傳值的問題還是有其他問題,最後也沒有過多的去糾結了,方法2在IE6/7/8中行不通。

從愚人碼頭那裡看來了方法3,下面是他的代碼:



複製代碼 程式碼如下:Array.prototype.delRepeat=function(){
 var newArray=[];
 var provisionalTable = {} var newArray=[];
 var provisionalTable = {} var newArray=[];
 var provisionalTable = {} i = 0, item; (item= this[i]) != null; i ) {
        if (!provisionalTable[item]) {
   );     provisionalTable[item] = true;
        }
    }
    return newArray;
};



方法3使用了一個暫時的物件來儲存陣列的元素,如果碰上重複的陣列元素,將會忽略掉。但是,如果碰到下面這種陣列:

複製程式碼 代碼如下:var arr = [ 'firefox', 11, '1 ' ];


上面的陣列如果用方法3會誤將 1 和 “1” 當成重複元素而刪除掉,於是有將方法3做了一點點的小修改,可以解決這個BUG。
方法3的修改版:


複製程式碼 程式碼如下:Array.prototype.distinct = function(p > var arr = [],
  obj = {},
  i = 0,
  len = this.length,
  result;

 for( ; i   result = this[i];
  if( obj[result] !== result ){ >   obj[result] = result;

  }
 }

 return arr;
};

之後又看了愚人碼頭文章後面的評論,該方法和Rekey提供的方法是一樣的,但是這個方法也有BUG,如果碰到這樣的2B數組就杯具了:

複製程式碼

代碼如下:var arr = [ 'firefox', 11, '1 ', 1 ];

上面的陣列用方法3的修改版,將不會刪除後3個元素,不過這種數組有點極端了,如果碰到字串字面量和數字相同的資料應該預先處理下以規避這種BUG。使用臨時物件的方法比 sort 在標準瀏覽器中略快,sort 方法在各瀏覽器中的演算法應該也有差異。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用WebSocket和JavaScript實現線上語音辨識系統 如何使用WebSocket和JavaScript實現線上語音辨識系統 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript實現線上語音辨識系統

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術

如何使用WebSocket和JavaScript實現線上預約系統 如何使用WebSocket和JavaScript實現線上預約系統 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript實現線上預約系統

PHP 陣列去重時指定移除重複元素的依據 PHP 陣列去重時指定移除重複元素的依據 Apr 28, 2024 pm 10:48 PM

PHP 陣列去重時指定移除重複元素的依據

如何利用JavaScript和WebSocket實現即時線上點餐系統 如何利用JavaScript和WebSocket實現即時線上點餐系統 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket實現即時線上點餐系統

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

簡易JavaScript教學:取得HTTP狀態碼的方法

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

JavaScript與WebSocket:打造高效率的即時天氣預報系統

如何在JavaScript中取得HTTP狀態碼的簡單方法 如何在JavaScript中取得HTTP狀態碼的簡單方法 Jan 05, 2024 pm 01:37 PM

如何在JavaScript中取得HTTP狀態碼的簡單方法

See all articles