摘要:這種方式比使用的一般姿勢要快,比使用表的最快姿勢要慢,但是占用內(nèi)存要少主要內(nèi)容來自數(shù)組去重的正確編寫姿勢
不賣關(guān)子,直入主題
數(shù)組去重,最先想到的便是依次遍歷數(shù)組,在已遍歷的元素中查找是否存在當前數(shù)組元素,重點是用什么存放已遍歷的數(shù)組,以及如何區(qū)分當前元素是否已存在
由于下面會用到indexOf()的方法,它是ES5語法,低版本會存在兼容,先應(yīng)添加對應(yīng)的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.數(shù)組存放,indexOf()判斷
遍歷數(shù)組,建立新數(shù)組,利用indexOf判斷是否存在于新數(shù)組中,不存在則push到新數(shù)組,最后返回新數(shù)組
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() { // 創(chuàng)建一個新的臨時數(shù)組,并且把當前數(shù)組的第一元素存入到數(shù)組中 var n = [this[0]]; // 從第二項開始遍歷 for (var i = 1; i < this.length; i++) { // 如果當前數(shù)組的第i項在當前數(shù)組中第一次出現(xiàn)的位置不是i,那么表示第i項是重復(fù)的,忽略掉,否則存入結(jié)果數(shù)組 if (this.indexOf(this[i]) == i) n.push(this[i]); } return n; }
JS引擎在實現(xiàn)indexOf()的時候會遍歷數(shù)組直到找到目標為止,此函數(shù)會浪費掉很多時間。所有這兩種方式都不是最優(yōu)的解決方式
// 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為臨時數(shù)組 var n = {}, r = []; for (var i = 0; i < this.length; i++) { // 如果hash表中沒有當前項 if (!n[this[i]]) { // 存入hash表 n[this[i]] = true; // 把當前數(shù)組的當前項push到臨時數(shù)組里面 r.push(this[i]); } } return r; }
但從耗時的角度來講,這是最優(yōu)的一種解決方式。但是從內(nèi)存占用角度來說,這并不是最優(yōu)的,因為多了一個hash表。這就是所謂的空間換時間
3.先排序,后比較
這種方式最大的優(yōu)勢就是排序后的比較次數(shù)變少,但是排序的過程也有性能消耗,應(yīng)權(quán)衡使用
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; }
這個方法的思路是先把數(shù)組排序,然后比較相鄰的兩個值。排序的時候用的JS原生的sort()方法,JS引擎內(nèi)部應(yīng)該是用的快速排序吧。這種方式比使用indexOf()的一般姿勢要快,比使用hash表的最快姿勢要慢,但是占用內(nèi)存要少
主要內(nèi)容來自:數(shù)組去重的正確編寫姿勢
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/84823.html
摘要:數(shù)組去重,一般會在面試的時候才會碰到,要求手寫數(shù)組去重方法的代碼。在實際項目中碰到的數(shù)組去重,一般都是后臺去處理,很少讓前端處理數(shù)組去重。數(shù)組去重的方法一利用去重中最常用如果不考慮兼容性,這種去重的方法代碼最少。 數(shù)組去重,一般會在面試的時候才會碰到,要求手寫數(shù)組去重方法的代碼。如果是被提問到,數(shù)組去重的方法有哪些?你能答出其中的10種,面試官很有可能對你刮目相看。 在實際項目中碰到的...
摘要:數(shù)組去重看了網(wǎng)上很多數(shù)組去重方法,用的比較常見的大概就幾種,今天想自己來做一個總結(jié)。還有就是方法返回的數(shù)組也是排序后的數(shù)組,某些情況下可能不符合要求。 JS數(shù)組去重 看了網(wǎng)上很多數(shù)組去重方法,用的比較常見的大概就幾種,今天想自己來做一個總結(jié)。部分內(nèi)容參考該博客 1 . 在原數(shù)組上操作(基本方法) 思路:利用循環(huán)嵌套,判斷數(shù)組中每個元素與其后面的元素是否相等,如果相等,就使用spli...
摘要:基本操作數(shù)組去重寫在前面數(shù)組去重經(jīng)常出現(xiàn)在前端招聘的筆試題里,比如有數(shù)組,請用實現(xiàn)去重函數(shù),使得返回作為筆試題,考點有二正確?;窘榻B文章主要是對數(shù)組去重的常用方法進行介紹。 js基本操作-數(shù)組去重 寫在前面 JavaScript 數(shù)組去重經(jīng)常出現(xiàn)在前端招聘的筆試題里,比如: 有數(shù)組 var arr = [a, b, c, 1, 0, c, 1, , 1, 0],請用 JavaScr...
摘要:基本操作數(shù)組去重數(shù)組去重的方法臨時數(shù)組保存其實這里面還沒考慮到數(shù)組里面嵌套數(shù)組對象的情況把去重后的結(jié)果放在一個臨時數(shù)組中對原來數(shù)組的元素與臨時數(shù)組元素比較臨時數(shù)組中不存在這個元素的放入臨時數(shù)組。 js基本操作-數(shù)組去重 數(shù)組去重的方法 1. 臨時數(shù)組保存(其實這里面還沒考慮到數(shù)組里面嵌套數(shù)組/對象的情況) 把去重后的結(jié)果放在一個臨時數(shù)組中, 對原來數(shù)組的元素與臨時數(shù)組元素比較, 臨時...
摘要:注方法可以返回某個指定字符串在字符串中首次出現(xiàn)的位置比如首次出現(xiàn)的位置是數(shù)組中的第一個,即下標為遍歷數(shù)組使用標識符去重聲明一個變量標識排序后遍歷過濾數(shù)組思路先給數(shù)組排序,這樣相同的項總是相鄰。 假設(shè)我們有數(shù)組arr,并且聲明新數(shù)組hash用來存放去重后的元素: var arr = [23,44,5,2,23,5,1,7,8,7]; //包含重復(fù)元素 var hash= [];...
閱讀 2879·2023-04-25 22:51
閱讀 2254·2021-10-11 10:58
閱讀 3383·2019-08-30 10:49
閱讀 1945·2019-08-29 17:09
閱讀 3191·2019-08-29 10:55
閱讀 905·2019-08-26 10:34
閱讀 3625·2019-08-23 17:54
閱讀 1045·2019-08-23 16:06