這篇文章帶給大家的內容是關於JavaScript陣列去重的方法總結(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
陣列去重在日常開發中的使用頻率還是較高的,也是網路上隨便一抓一大把的話題,所以,我寫這篇文章目的在於歸納和總結,既然很多人都在提的數組去重,自己到底了解多少呢。又或者是如果自己在開發上遇到了去重的需求,自己能想到更好的解決方案嗎。
這次我們來理一理怎麼做數組去重才能做得最合適,既要考慮相容性,也要考慮效能和程式碼的優雅。
我的學習路徑是模仿冴羽(github: mqyqingfeng)的學習方式,感謝像冴羽這樣優秀的人在前面領跑,我不想光看不做,所以多實踐多輸出,希望未來能走出我自己的路。
一、入門方案
function unique(origin) { var result = []; for(var i = 0; i <p>以上程式碼是最簡單實作陣列去重的方式,優點在於相容性極佳,缺點就是兩次for 循環,時間複雜度為O(n ^2),性能較差。 </p><h4 id="二-陣列的-indexOf-屬性">二、陣列的 indexOf 屬性</h4><p>陣列中的 indexOf 屬性是 ES5 的規範,只有 IE8 及更早版本不支援此方法。相對來說,如果你不需要相容 IE8 的話,盡量用 indexOf 來判斷一個元素是否在陣列中。 </p><pre class="brush:php;toolbar:false">function unique(origin){ var result = []; for(var i = 0; i<h4 id="三-數組的-filter-屬性">三、數組的 filter 屬性</h4><blockquote>數組的 filter() 方法建立一個新的數組,新數組中的元素是透過檢查指定數組中符合條件的所有元素。 </blockquote><p>filter 的回呼有三個參數,其中第三個參數是目前元素屬於的陣列對象,這樣我們就可以繼續利用 indexOf 屬性啦。 </p><pre class="brush:php;toolbar:false">function unique(origin) { var result = origin.filter(function (item, index, array){ // 获取元素在源数组的位置,只返回那些索引等于当前元素索引的值。 return array.indexOf(item) === index; }); return result; }
filter 相容到 IE9, 這種方法沒有 for 循環,主要利用了 filter 和 indexOf 屬性,所以程式碼相對比較優雅。
四、利用Object 的key value
function unique(origin) { var result = []; var hashTable = {}; for(var i = 0; i<p>這種方案的事件複雜度為O(n), 但是物件的鍵,預設是字串類型,這代表什麼呢,數字1 和字串'1',在鍵中是相等的,所以,上面這種方法不適合字串和數字混合的去重。 </p><p>所以我們將元素的類型也放入物件的鍵中:</p><pre class="brush:php;toolbar:false">function unique(origin) { var result = []; var hashTable = {}; for(var i = 0; i<h4 id="五-陣列的sort-方法">五、陣列的sort 方法</h4><pre class="brush:php;toolbar:false">function unique(origin) { return origin.concat.sort().filter(function(item, index, array) { // !index 表示第 0 个元素应该被返回。 return !index || item !== origin[index-1] }) } function unique(array) { array.sort(); // 排序字符串 array.sort(function(a, b) { return a-b; // 排序数字 }) for(let i=0; i<array.length><p>sort 方法的優點在於利用了排序,返回後一個和前一個不相等的元素。比較簡潔和直觀。缺點在於改變了元素的本來的排序位置。 </p> <h4 id="六-ES-Set">六、ES6 Set</h4> <p>ES6 提供了新的資料結構 Set,它類似數組,但是成員的值都是唯一的,沒有重複的值。在 Set 加入值的時候,不會發生型別轉變,所以 5 和 '5' 是兩個不同的值。 Set內部判斷兩個值是否相同,用的是類似"==="的演算法,但差異是,在set內部認為NaN 等於NaN ;</p> <p>Set 可以轉換為數組,所以很容易實現去重</p> <pre class="brush:php;toolbar:false">function unique(origin) { return Array.from(new Set(origin)); }
七、ES6 Map
ES6 新增了Map 資料結果,透過has 和set 方法就能很方便的對前面的object key value 方案進行最佳化。
function unique(origin){ const map = new Map() return origin.filter((item) => !map.has(item) && map.set(item, true)) }
八、型別判斷
一些常見的資料型別是===
和indexOf
是無法偵測的,舉例:
console.log({} === {}) // false; console.log(NaN === NaN) // false; console.log(/a/ === /a/); // false; console.log(1 === new String('1')) // false; var arr = [NaN]; console.log(arr.indexOf(NaN)); // -1
所以在判斷的時候,如果資料裡有NaN 和物件時要避免使用indexOf
和===
;
前面Set 那裡說過了,所以Set 方法是可以去重NaN的。
總結
資料去重在網路上已經看煩了,但還是想專門寫一篇文章來實踐和總結,能在工作中多幾個思路也是極好的。感謝那些熱愛分享和喜歡輸出的人。
#以上是JavaScript數組去重的方法總結(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),