數組去重12種方案(經典面試必問)

數組去重12種方案

兜個小圈 先總結一下咱們數組的方法:

  • pop
  • push
  • shift
  • unshift
  • slice
  • splice
  • sort
  • reverse
  • concat
  • join
  • indexOf
  • lastIndexOf
  • map
  • forEach

還有其餘能夠處理數組的幾個方法~

- includes:方法用來判斷一個數組是否包含一個指定的值,根據狀況,若是包含則返回 true,不然返回false。

- find:返回第一次找到的那一項

- some:返回一個布爾值,只要一個是true,就返回true

- every:返回一個布爾值,須要每一項都是true,才返回true

- filter:返回一個過濾後的新數組;若是返回true就留下,false就過濾掉

- reduce:收斂

下面咱們進入正題~(但願能對你有幫助~小編有點皮!!哈哈哈哈哈哈)數組

方法一:set :不是一種數據類型,是一種數據結構;成員惟一

let arr = [12,1,12,3,1,88,66,9,66];
function unique(ary) {
        let s  = new Set(ary);
        // Array.from : 將set數據結構轉成真正的數組;
        return  Array.from(s)
    }
    unique(arr);
複製代碼

方法二:對象屬性名不能重複

let arr = [12,1,12,3,1,88,66,9,66];
function unique(ary) {
        let obj = {};
        for(let i=0;i<ary.length;i++){
            let cur = ary[i];
            if(obj[cur]){
                //ary.splice(i,1);// 致使數組塌陷
                ary[i]=ary[ary.length-1];
                ary.length--;// 刪除最後一項
                i--;
                continue;
            }
            obj[cur]=cur;// 給obj新增鍵值對;屬性名和屬性值是同樣的
        }
    }
    unique(arr);
複製代碼

方法三:indexOf

let arr = [12,1,12,3,1,88,66,9,66];
 function unique(ary) {
        let newAry = [];
        for(let i=0;i<ary.length;i++){
            let  cur = ary[i];
            if(newAry.indexOf(cur)===-1){
                newAry.push(cur);
            }
        }
        return newAry;
    }
    unique(arr)
複製代碼

方法四:sort

let arr = [12,1,12,3,1,88,66,9,66];
function unique(ary) {
       let a = ary.sort(function (a,b) {
           return a-b;
       });
       for(let i=0;i<a.length;i++){
           if(a[i]===a[i+1]){
               a.splice(i+1,1);
               i--;
           }
       }
       return a;
   }
   unique(arr)
複製代碼

方法五:includes :包含;若是數組包含那一項,返回true;不包含返回false;

let arr = [12,1,12,3,1,88,66,9,66];
function unique(ary) {
        let newAry = [];
        let len = ary.length;
        for(let i=0;i<len;i++){
            let cur = ary[i];
            if(!newAry.includes(cur)){
                newAry.push(cur);
            }
        }
        return newAry;
    }
    console.log(unique(arr));
複製代碼

方法六:hasOwnProperty : 檢測屬性名是不是對象的一個私有屬性;返回一個布爾值;

let arr = [12,1,12,3,1,88,66,9,66];
function unique(ary) {
        let obj = {};
        return ary.filter(function (item,index,a) {
            // item : 數組每個成員
            // index: 成員對應的索引
            // a : 整個數組
            // hasOwnProperty來校驗的該屬性是否出現過;
           return  obj.hasOwnProperty(typeof item+item)?false:obj[typeof item+item]=true;
           if(obj.hasOwnProperty(typeof item+item)){
               return false
           }else{
               obj[typeof item+item]=true;
               return true;
           }
        })
    }
    console.log(unique(arr))
複製代碼

方法七:filter+indexOf

let arr = [12,1,12,3,1,88,66,9,66];
    function unique(ary) {
        return ary.filter(function (item,index,a) {
            return ary.indexOf(item)===index;
        })
    }
    console.log(unique(arr));

複製代碼

方法八:splice

let arr = [12,1,12,3,1,88,66,9,66];
 function unique(ary) {
        for(let i=0;i<ary.length;i++){
            for(j=i+1;j<ary.length;j++){
                if(ary[i]===ary[j]){
                    ary.splice(j,1);
                    j--;
                }
            }
        }
        return ary;
    }
    unique(arr);
複製代碼

方法九:遞歸

let arr = [12,1,12,3,1,88,66,9,66];
function unique(ary) {
        let  len= ary.length;
        ary = ary.sort(function (a,b) {
            return a-b;
        });
        function loop(index) {
            if(index>=1){
                if(ary[index]===ary[index-1]){
                    ary.splice(index,1);
                }
                loop(index-1)
            }
        }
        loop(len-1);
        return ary;
    }
    console.log(unique(arr));
複製代碼

方法十:Map :利用了Map數據結構存值的特色;

let arr = [12,1,12,3,1,88,66,9,66];
function unique(ary) {
        let newAry =[];
        let map = new Map();
        for(let i=0;i<ary.length;i++){
            if(!map.has(ary[i])){
                map.set(ary[i],true);
                newAry.push(ary[i]);
            }
        }
    }
    unique(arr);
複製代碼

方法十一:reduce

let arr = [12,1,12,3,1,88,66,9,66];
function unique(ary) {
        // reduce : 第一個是函數,第二個參數會傳給第一次回調的prev;
        return ary.reduce((prev,next)=>{
            // 該函數返回值是下一次執行的prev;
            return prev.includes(next)?prev:[...prev,next];
        },[])
    }
    console.log(unique(arr));
複製代碼

方法十二:相似於方法一的set,用了剩餘運算符...

let  arr = [12,1,12,3,1,88,66,9,66];
    let a = [...new Set(arr)];
    console.log(a);

複製代碼

今天先整理出這些去重方法,歡迎大佬們指點補充~ღ( ´・ᴗ・` )比心

相關文章
相關標籤/搜索