您好,登錄后才能下訂單哦!
前言
有時候我們做項目的時候往往會需要把數組里面一些重復的項去掉,但是原生JS有排序,有篩選等等,但是就是沒有數組去重怎么辦呢?
這能怎么辦,自己手動實現嘛。
數組不像對象和hash有唯一的標志特征(key)。所以,數組去重的核心就是【1】數組內元素互相比較,然后放入新的數組中。【2】參照對象構建一個唯一的特征標志,然后放入新數組中。以下就是依照這種思路產生的方法。【3】數組中含對象的去重方式我采用使用JSON.stringify()
將對象轉換成JSON字符串進行比較的方式。
1.最基礎的去重:雙重遍歷
雙重遍歷的核心就是依據【1】,通過拿出一個元素和剩下的元素依次比較,如果全部不相等則證明此元素為唯一。
let a=[{a:1},{b:2},{c:3},{a:1},{d:2}] let c=[1,2,3,4,5,6,1,2,3] function unique(arr){ let b=[] for(let i=0;i<arr.length;i++){ let unexit=true for(let j=i+1;j<arr.length;j++){ if(JSON.stringify(arr[i])===JSON.stringify(arr[j])){ unexit=false break } else{ unexit=true } } if(unexit){ b.push(arr[i]) } } return b }
關于數組中存在對象,是采用JSON.stringify()
轉換成JSON字符串進行的比較,后續不再敘述。雙重遍歷的缺點是復雜度太高。
上面的代碼去重得到的結果的順序會改變,所以如果想要順序按照原有順序,數組在進行去重時建議重新申明一個新的數組(var new=old.reverse()
)得到一個新的相反的數組,最后再使用reverse()。之所以新建數組而不是直接取反是因為:reverse()
會修改原數組。
2.Array.prototype.sort():相鄰元素去重
相鄰元素去重的核心在于Array.sort()
能夠對數組進行排序。這樣相等的數組就會在相鄰的位置,通過比較相鄰的元素就可以起到去重的作用【1】。
let c=[1,2,3,4,5,6,1,2,3] function unique(arr){ let Arr=arr.sort() let b=[] for(let i=0;i<Arr.length;i++){ if(Arr[i]!==Arr[i+1]){ b.push(Arr[i]) } } return b }
Array.prototype.sort()
方法可以使用array.sort((a,b)=>{a.key-b.ky})
進行對象的排序,前提是數組中的對象存在相同的key值。
3.Object.keys():存在唯一性
在一個對象里面key值是唯一的,所以通過遍歷數組給每個數組一個標志,通過標志去重【2】
let a=[{a:1},{b:2},{c:3},{a:1},{d:2}] let c=[1,2,3,4,5,6,1,2,3] function unique(arr){ let b=[] let hash={} for(let i=0;i<arr.length;i++){ if(!hash[JSON.stringify(arr[i])]){ hash[JSON.stringify(arr[i])]=true b.push(arr[i]) } } return b }
4.雙重遍歷去重改良之:indexOf
雙重遍歷的思路我們都知道,先拿出一個元素,然后使用循環再次遍歷數組去一一比較。如果有一個方式能夠讓我們不再遍歷一遍數組,那么復雜度相對而言會減少一點。
indexOf 方法返回給定元素在數組中第一次出現的位置,如果沒有出現則返回-1。首先我們新建一個空數組(arry),如果:arry.indexOf
(數組元素)===-1,那么我們就可以知道arry中不存在元素。
let c=[1,2,3,4,5,6,1,2,3] function unique(arr){ let b=[] for(let i=0;i<arr.length;i++){ if(b.indexOf(arr[i])==-1){ b.push(arr[i]) } } return b }
indexOf 方法可返回某個指定的字符串值在字符串中首次出現的位置。所以對象不適用,因為對象轉為字符串就都會變成{object,object}
,無法比較。
5.循環遍歷之:map()/forEach()
map()和forEach()都可以實現遍歷數組。所以以上的方法都可以用map()、forEach()改寫。下面我只簡單的改寫一個,其他的改寫方式參照即可。
let c=[1,2,3,4,5,6,1,2,3] function unique(arr){ let b=[] arr.forEach(res=>{ if(b.indexOf(res)==-1){ b.push(res) } }) return b }
6.ES6:Set數據結構
Set數據類似于數組,但是成員的值都是唯一的,沒有重復的值。它可以接收一個數組,類于:let a=[1,2,3,1,2] Set(a)=>1,2,3
所以可以使用Set()實現去重。
let c=[1,2,3,4,5,6,1,2,3] function unique(arr){ let b=new Set(arr) let c=Array.from(b) return c }
Set去重不適用于含對象的數組,因為Set的去重參照的是(===),數組中的元素對象,雖然可能數值相等,但是地址不相等。所以Set無法實現去重。
7.總結
實現數組的去重,要么通過元素對比,要么設置特殊標志識別。元素對比的思路有2種:一種是和原數組一一對比;另一種和新的數組對比。
如果要實現含對象的數組去重,一般使用遍歷的方式,包括使用遍歷類的方法(map、forEach、reduce等)。像Set、sort等通過改變數組的方式一般是不可行的。
好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。