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