亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript數組去重的幾種方法

 更新時間:2019年04月07日 15:26:08   作者:Hcl  
這篇文章主要給大家介紹了關于JavaScript數組去重的幾種方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用JavaScript具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

有時候我們做項目的時候往往會需要把數組里面一些重復的項去掉,但是原生JS有排序,有篩選等等,但是就是沒有數組去重怎么辦呢?

這能怎么辦,自己手動實現(xiàn)嘛。

數組不像對象和hash有唯一的標志特征(key)。所以,數組去重的核心就是【1】數組內元素互相比較,然后放入新的數組中?!?】參照對象構建一個唯一的特征標志,然后放入新數組中。以下就是依照這種思路產生的方法。【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字符串進行的比較,后續(xù)不再敘述。雙重遍歷的缺點是復雜度太高。
上面的代碼去重得到的結果的順序會改變,所以如果想要順序按照原有順序,數組在進行去重時建議重新申明一個新的數組(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

雙重遍歷的思路我們都知道,先拿出一個元素,然后使用循環(huán)再次遍歷數組去一一比較。如果有一個方式能夠讓我們不再遍歷一遍數組,那么復雜度相對而言會減少一點。

indexOf 方法返回給定元素在數組中第一次出現(xiàn)的位置,如果沒有出現(xiàn)則返回-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 方法可返回某個指定的字符串值在字符串中首次出現(xiàn)的位置。所以對象不適用,因為對象轉為字符串就都會變成{object,object} ,無法比較。

5.循環(huán)遍歷之:map()/forEach()

map()和forEach()都可以實現(xiàn)遍歷數組。所以以上的方法都可以用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()實現(xiàn)去重。

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無法實現(xiàn)去重。

7.總結

實現(xiàn)數組的去重,要么通過元素對比,要么設置特殊標志識別。元素對比的思路有2種:一種是和原數組一一對比;另一種和新的數組對比。

如果要實現(xiàn)含對象的數組去重,一般使用遍歷的方式,包括使用遍歷類的方法(map、forEach、reduce等)。像Set、sort等通過改變數組的方式一般是不可行的。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

相關文章

  • 基于JavaScript實現(xiàn)手機短信按鈕倒計時(超簡單)

    基于JavaScript實現(xiàn)手機短信按鈕倒計時(超簡單)

    在淘寶等購物網站,我們都會看到一個發(fā)送短信倒計時的按鈕,究竟是如何實現(xiàn)的呢?下面小編通過本篇文章給大家分享一段代碼關于js實現(xiàn)手機短信按鈕倒計時,需要的朋友參考下
    2015-12-12
  • 一些常用的JavaScript函數(json)附詳細說明

    一些常用的JavaScript函數(json)附詳細說明

    一些常用的JavaScript函數(json)附詳細說明,學習js的朋友可以參考下。
    2011-05-05
  • 淺析Ajax語法

    淺析Ajax語法

    本文主要介紹了原生JS中Ajax的實現(xiàn)原理,XMLHttpRequest及promise的概念和流程。需要的朋友可以看下
    2016-12-12
  • JS實現(xiàn)對JSON數據進行冒泡排序

    JS實現(xiàn)對JSON數據進行冒泡排序

    JavaScript 是一種廣泛使用的腳本語言,JSON是一種常見的數據格式,這篇文章主要來探討一下如何使用 JavaScript 對 JSON 數據進行冒泡排序,感興趣的可以了解一下
    2023-06-06
  • javascript實現(xiàn)2016新年版日歷

    javascript實現(xiàn)2016新年版日歷

    這篇文章主要為大家介紹了javascript實現(xiàn)2016新年版日歷的詳細代碼,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 原生JavaScript實現(xiàn)滾動條效果

    原生JavaScript實現(xiàn)滾動條效果

    這篇文章主要介紹了原生JavaScript實現(xiàn)滾動條效果的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • KnockoutJS 3.X API 第四章之表單value綁定

    KnockoutJS 3.X API 第四章之表單value綁定

    Knockout是一個以數據模型(data model)為基礎的能夠幫助你創(chuàng)建富文本,響應顯示和編輯用戶界面的JavaScript類庫。這篇文章主要介紹了KnockoutJS 3.X API 第四章之表單value綁定的相關資料,需要的朋友可以參考下
    2016-10-10
  • JS+CSS實現(xiàn)另類帶提示效果的豎向導航菜單

    JS+CSS實現(xiàn)另類帶提示效果的豎向導航菜單

    這篇文章主要介紹了JS+CSS實現(xiàn)另類帶提示效果的豎向導航菜單,可實現(xiàn)鼠標滑過菜單項在下方固定區(qū)域顯示對應提示文字的效果,涉及鼠標事件控制頁面元素樣式的相關技巧,需要的朋友可以參考下
    2015-10-10
  • 使用原生js封裝的ajax實例(兼容jsonp)

    使用原生js封裝的ajax實例(兼容jsonp)

    下面小編就為大家?guī)硪黄褂迷鷍s封裝的ajax實例(兼容jsonp)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • JS實現(xiàn)把一個頁面層數據傳遞到另一個頁面的兩種方式

    JS實現(xiàn)把一個頁面層數據傳遞到另一個頁面的兩種方式

    這篇文章主要介紹了JS實現(xiàn)把一個頁面層數據傳遞到另一個頁面的方式,本文給大家提供了兩種方式,需要的朋友可以參考下
    2018-08-08

最新評論