摘要:主要用到數(shù)組的方法。第一種方式是判斷數(shù)組中的第一索引號等于參數(shù)索引號,一般來說,如果數(shù)組元素重復(fù),除第一個元素外,所有重復(fù)元素的索引和該元素對應(yīng)的第一索引是不同的。
1.最簡方法
創(chuàng)建一個空的新數(shù)組,依次檢查舊數(shù)組的值是否存在于新數(shù)組中,如果不存在就push進(jìn)去。主要用到數(shù)組的indexOf方法。
function arrUnique(arr){ var newArr = []; for (i = 0; i < arr.length; i++){ if (newArr.indexOf(arr[i]) == -1){ newArr.push(arr[i]); } } return newArr; } var arr = [1,2,3,4,5,3,2]; console.log(arrUnique(arr));2.對象屬性賦值1
通過將舊數(shù)組的值分別賦值給對象的屬性,由于對象屬性賦值時舊屬性會被新的同名屬性覆蓋,所以保證了數(shù)組(屬性)的單一性,最后通過for in將這些屬性push到新數(shù)組中。
function arrUnique(arr){ var obj = {}; var newArr = []; arr.map(function(item){ obj[item] = null; }) for (var key in obj){ newArr.push(Number(key)); } return newArr; } var arr = [1,2,3,4,5,3,2]; console.log(arrUnique(arr));3 對象屬性賦值2
創(chuàng)建一個空數(shù)組和空對象,檢查舊數(shù)組的值是否作為對象的屬性存在,如果不存在就給這個對象添加數(shù)組值屬性,屬性值為1,并且把這個數(shù)組的值賦值給新數(shù)組。利用的原理還是對象屬性值會被覆蓋,也就是說是唯一的。下標(biāo)的引用要比用indexOf搜索數(shù)組快的多,所以該方法方法2快。此處的對象其實(shí)是一個哈希表,雖然速度快很多,但是內(nèi)存占用較大,也就是以空間換時間。
function arrUnique(arr){ var newArr = []; var obj = {}; for (var i = 0; i < arr.length; i++){ if (!obj[arr[i]]){ newArr.push(arr[i]); obj[arr[i]]=1; } } return newArr; } var arr = [1,2,3,4,5,3,2]; console.log(arrUnique(arr));4 先使用數(shù)組的sort方法排序,節(jié)省空間且速度較快
先對原數(shù)組排序,然后判斷數(shù)組元素是否在新數(shù)組的最后一位,如果不是就push進(jìn)去。這種方法比單純循環(huán)要快很多,雖然沒有哈希表方式快,但是不占用較大空間。
function arrUnique(arr){ arr.sort();//快排 var newArr = []; for(var i = 0; i < arr.length; i++){ if (arr[i] !== newArr[newArr.length - 1]){ newArr.push(arr[i]); } } return newArr; } var arr = [1,2,3,4,5,3,2]; console.log(arrUnique(arr));5 來自評論區(qū)的善意
昨天發(fā)布該文之后,今天收到評論區(qū) 亦秋 的反饋,給出了兩種很簡潔的ES6去重方式。
1)第一種方式是判斷數(shù)組中的第一索引號等于參數(shù)索引號,一般來說,如果數(shù)組元素重復(fù),除第一個元素外,所有重復(fù)元素的索引和該元素對應(yīng)的第一索引是不同的。該處第一索引是指自左向右搜索到的第一個元素的索引號。
[1,2,3,4,5,3,2].filter((value, index, array) => array.indexOf(value) === index)
2)通過ES6的Set數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)類似于數(shù)組,但是不會出現(xiàn)重復(fù)元素,因此,只要基于原始數(shù)組創(chuàng)建Set結(jié)構(gòu),然后在數(shù)組內(nèi)部展開就成了單一元素?cái)?shù)組。
[...new Set([1,2,3,4,5,3,2])]
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/82200.html
摘要:專題系列第三篇,講解各種數(shù)組去重方法,并且跟著寫一個前言數(shù)組去重方法老生常談,既然是常談,我也來談?wù)劇K愃朴跀?shù)組,但是成員的值都是唯一的,沒有重復(fù)的值。 JavaScript 專題系列第三篇,講解各種數(shù)組去重方法,并且跟著 underscore 寫一個 unique API 前言 數(shù)組去重方法老生常談,既然是常談,我也來談?wù)劇?雙層循環(huán) 也許我們首先想到的是使用 indexOf 來循...
摘要:但是這并不妨礙我們從思維拓展的角度出發(fā),看看去重可以用幾種思路去實(shí)現(xiàn)。首先是常規(guī)的雙層循環(huán)比對的思路實(shí)現(xiàn)定義一個變量表示當(dāng)前元素在中是否存在。依次對中的元素和原數(shù)組元素進(jìn)行比對。重點(diǎn)是保證碰撞的幾率小到比中大獎還小就可以了。 前端在日常開發(fā)中或多或少都會碰到有對數(shù)據(jù)去重的需求,實(shí)際上,像是lodash這些工具庫已經(jīng)有成熟完備的實(shí)現(xiàn),并且可以成熟地運(yùn)用于生產(chǎn)環(huán)境。但是這并不妨礙我們從思維...
摘要:方式使用獲取并刪除刪除數(shù)組的第一個元素,判斷這個元素是否還存在于數(shù)組中,如果存在則說明這個元素的是重復(fù)的如果不存在,進(jìn)行操作方式建立一個哈希表,通過對象屬性查詢?nèi)コ貜?fù)元素方式思路和方式類似,但是簡潔很多來源個人博客 方式1:使用shift()獲取并刪除刪除數(shù)組的第一個元素,判斷這個元素是否還存在于數(shù)組中,如果存在則說明這個元素的是重復(fù)的;如果不存在,進(jìn)行push()操作 functi...
摘要:數(shù)組去重方法的總結(jié)前言在中數(shù)組是比較常用的,本文中總結(jié)了下數(shù)組去重的幾種常用方法,如有問題,請指正。 JavaScript數(shù)組去重方法的總結(jié) 前言 在JavaScript中數(shù)組是比較常用的,本文中總結(jié)了下數(shù)組去重的幾種常用方法,如有問題,請指正。 簡單粗暴的一種,ES6中set方法: var arr = [1,2,2,3,3,4,5,5]; console.log([...new Se...
摘要:否則存入結(jié)果數(shù)組。否則存入結(jié)果數(shù)組排序后相鄰去除法雖然原生數(shù)組的方法排序結(jié)果不怎么靠譜,但在不注重順序的去重里該缺點(diǎn)毫無影響。實(shí)現(xiàn)思路給傳入數(shù)組排序,排序后相同值相鄰,然后遍歷時新數(shù)組只加入不與前一值重復(fù)的值。 1.遍歷數(shù)組法 實(shí)現(xiàn)思路:新建一新數(shù)組,遍歷傳入數(shù)組,值不在新數(shù)組就加入該新數(shù)組中;注意點(diǎn):判斷值是否在數(shù)組的方法indexOf是ECMAScript5 方法,IE8以下不支持...
閱讀 2385·2021-11-15 11:37
閱讀 2637·2021-09-23 11:21
閱讀 2967·2021-09-07 10:11
閱讀 3174·2019-08-30 15:53
閱讀 2834·2019-08-29 15:13
閱讀 1618·2019-08-26 13:57
閱讀 1111·2019-08-26 12:23
閱讀 2450·2019-08-26 11:51