摘要:這種方式比使用的一般姿勢要快,比使用表的最快姿勢要慢,但是占用內存要少主要內容來自數組去重的正確編寫姿勢
不賣關子,直入主題
數組去重,最先想到的便是依次遍歷數組,在已遍歷的元素中查找是否存在當前數組元素,重點是用什么存放已遍歷的數組,以及如何區分當前元素是否已存在
由于下面會用到indexOf()的方法,它是ES5語法,低版本會存在兼容,先應添加對應的polyfill
Array.prototype.indexOf = Array.prototype.indexOf || function (searchElement, fromIndex) { var index = -1; fromIndex = fromIndex * 1 || 0; for (var k = 0, length = this.length; k < length; k++) { if (k >= fromIndex && this[k] === searchElement) { index = k; break; } } return index; };
1.數組存放,indexOf()判斷
遍歷數組,建立新數組,利用indexOf判斷是否存在于新數組中,不存在則push到新數組,最后返回新數組
Array.prototype.unique = function() { var n = []; // 存放已遍歷的滿足條件的元素 for (var i = 0; i < this.length; i++) { // indexOf()判斷當前元素是否已存在 if (n.indexOf(this[i]) == -1) n.push(this[i]); } return n; }
下面是一個思想基本相同的變相版本
Array.prototype.unique = function() { // 創建一個新的臨時數組,并且把當前數組的第一元素存入到數組中 var n = [this[0]]; // 從第二項開始遍歷 for (var i = 1; i < this.length; i++) { // 如果當前數組的第i項在當前數組中第一次出現的位置不是i,那么表示第i項是重復的,忽略掉,否則存入結果數組 if (this.indexOf(this[i]) == i) n.push(this[i]); } return n; }
JS引擎在實現indexOf()的時候會遍歷數組直到找到目標為止,此函數會浪費掉很多時間。所有這兩種方式都不是最優的解決方式
// es5簡化版 Array.prototype.unique = function() { return this.filter((v, i) => this.indexOf(v) === i) } // es6簡化版 Array.prototype.unique = function() { return Array.from(new Set(this)); } // 或 Array.prototype.unique = function() { return [...new Set(this)]; }
2.對象存放,哈希算法(映射)判斷
Array.prototype.unique = function() { // n為hash表,r為臨時數組 var n = {}, r = []; for (var i = 0; i < this.length; i++) { // 如果hash表中沒有當前項 if (!n[this[i]]) { // 存入hash表 n[this[i]] = true; // 把當前數組的當前項push到臨時數組里面 r.push(this[i]); } } return r; }
但從耗時的角度來講,這是最優的一種解決方式。但是從內存占用角度來說,這并不是最優的,因為多了一個hash表。這就是所謂的空間換時間
3.先排序,后比較
這種方式最大的優勢就是排序后的比較次數變少,但是排序的過程也有性能消耗,應權衡使用
Array.prototype.unique = function() { this.sort(); var re = [this[0]]; for (var i = 1; i < this.length; i++) { if (this[i] !== re[re.length - 1]) { re.push(this[i]); } } return re; }
這個方法的思路是先把數組排序,然后比較相鄰的兩個值。排序的時候用的JS原生的sort()方法,JS引擎內部應該是用的快速排序吧。這種方式比使用indexOf()的一般姿勢要快,比使用hash表的最快姿勢要慢,但是占用內存要少
主要內容來自:數組去重的正確編寫姿勢
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/84823.html
摘要:數組去重看了網上很多數組去重方法,用的比較常見的大概就幾種,今天想自己來做一個總結。還有就是方法返回的數組也是排序后的數組,某些情況下可能不符合要求。 JS數組去重 看了網上很多數組去重方法,用的比較常見的大概就幾種,今天想自己來做一個總結。部分內容參考該博客 1 . 在原數組上操作(基本方法) 思路:利用循環嵌套,判斷數組中每個元素與其后面的元素是否相等,如果相等,就使用spli...
摘要:基本操作數組去重寫在前面數組去重經常出現在前端招聘的筆試題里,比如有數組,請用實現去重函數,使得返回作為筆試題,考點有二正確。基本介紹文章主要是對數組去重的常用方法進行介紹。 js基本操作-數組去重 寫在前面 JavaScript 數組去重經常出現在前端招聘的筆試題里,比如: 有數組 var arr = [a, b, c, 1, 0, c, 1, , 1, 0],請用 JavaScr...
摘要:基本操作數組去重數組去重的方法臨時數組保存其實這里面還沒考慮到數組里面嵌套數組對象的情況把去重后的結果放在一個臨時數組中對原來數組的元素與臨時數組元素比較臨時數組中不存在這個元素的放入臨時數組。 js基本操作-數組去重 數組去重的方法 1. 臨時數組保存(其實這里面還沒考慮到數組里面嵌套數組/對象的情況) 把去重后的結果放在一個臨時數組中, 對原來數組的元素與臨時數組元素比較, 臨時...
摘要:注方法可以返回某個指定字符串在字符串中首次出現的位置比如首次出現的位置是數組中的第一個,即下標為遍歷數組使用標識符去重聲明一個變量標識排序后遍歷過濾數組思路先給數組排序,這樣相同的項總是相鄰。 假設我們有數組arr,并且聲明新數組hash用來存放去重后的元素: var arr = [23,44,5,2,23,5,1,7,8,7]; //包含重復元素 var hash= [];...
閱讀 2801·2023-04-25 22:51
閱讀 2026·2021-10-11 10:58
閱讀 3308·2019-08-30 10:49
閱讀 1870·2019-08-29 17:09
閱讀 3136·2019-08-29 10:55
閱讀 839·2019-08-26 10:34
閱讀 3467·2019-08-23 17:54
閱讀 980·2019-08-23 16:06