• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    JavaScript數組去重的幾種方法

    來源:懂視網 責編:小采 時間:2020-11-27 21:59:15
    文檔

    JavaScript數組去重的幾種方法

    JavaScript數組去重的幾種方法:前言 有時候我們做項目的時候往往會需要把數組里面一些重復的項去掉,但是原生JS有排序,有篩選等等,但是就是沒有數組去重怎么辦呢? 這能怎么辦,自己手動實現嘛。 數組不像對象和hash有唯一的標志特征(key)。所以,數組去重的核心就是【1】數組內元素互相
    推薦度:
    導讀JavaScript數組去重的幾種方法:前言 有時候我們做項目的時候往往會需要把數組里面一些重復的項去掉,但是原生JS有排序,有篩選等等,但是就是沒有數組去重怎么辦呢? 這能怎么辦,自己手動實現嘛。 數組不像對象和hash有唯一的標志特征(key)。所以,數組去重的核心就是【1】數組內元素互相

    前言

    有時候我們做項目的時候往往會需要把數組里面一些重復的項去掉,但是原生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等通過改變數組的方式一般是不可行的。

    好了,

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    JavaScript數組去重的幾種方法

    JavaScript數組去重的幾種方法:前言 有時候我們做項目的時候往往會需要把數組里面一些重復的項去掉,但是原生JS有排序,有篩選等等,但是就是沒有數組去重怎么辦呢? 這能怎么辦,自己手動實現嘛。 數組不像對象和hash有唯一的標志特征(key)。所以,數組去重的核心就是【1】數組內元素互相
    推薦度:
    標簽: 方法 種方法 js
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 97精品国产一区二区三区| 亚洲国产精品线在线观看| 久久福利青草精品资源站免费| 久久久久无码精品国产app| 999精品在线| 自拍偷自拍亚洲精品被多人伦好爽 | 久久99热精品| 国内精品久久久久影院日本| 亚洲A∨精品一区二区三区| 国产成人精品一区二三区在线观看 | 亚洲午夜精品一级在线播放放 | 亚洲精品无码久久久久久| 国产精品成人99久久久久| 国产精品久久网| 精品国产粉嫩内射白浆内射双马尾 | 亚洲国产精品乱码一区二区 | 国产精品午夜无码AV天美传媒 | 午夜精品久久久久久99热| 久久国产精品免费| 国产成人精品久久一区二区三区av| 国产精品网站在线观看| 国产成人精品AA毛片| 久久九九精品99国产精品| 亚洲国产精品福利片在线观看 | 亚洲精品国产精品国自产观看 | 欧美国产精品久久高清| 久久国产美女免费观看精品 | 国产精品婷婷午夜在线观看| 成人国产精品秘 果冻传媒在线| 欧美精品国产日韩综合在线| 一区二区三区精品国产欧美| 国产欧美日韩精品专区| 97视频在线精品国自产拍| 久久久国产精品福利免费| 久久精品国产秦先生| 四虎最新永久在线精品免费| 老司机69精品成免费视频| 精品亚洲综合在线第一区| 国产精品亚洲欧美一区麻豆 | 精品国产呦系列在线观看免费| 国产精品小视频免费无限app|