JS基本入門篇(十五)—數組去重

目標:把數組中反覆的內容去掉。
eg:將數組[2, 3, 1, 4, 2, 2, 3, 4, 1, 5,”1″]變成[2, 3, 1, 4, 5, “1”]。

思緒1:

每次掏出數組 一項,和其他的一切項比較
假如比較 有雷同的 , 把反覆的這個(背面的)刪掉。

<script>
    var arr = [2, 3, 1, 4, 2, 2, 3, 4, 1, 5,"1"];
    //遍曆數組
    for(var i=0;i<arr.length;i++){
        //每次比較i 以後的內容
        for(var j=i+1;j<arr.length;j++){
            if(arr[i]===arr[j]){
                //刪除背面的這一個。
                //j是位置,1示意長度。
                //這個要領不清楚的  能夠看我這一篇文章 https://segmentfault.com/a/1190000014973607
                arr.splice(j,1);
                //刪除以後,數組長度會減1,要想比較剔除的背面一名。因為數組長度變短,后一名提早了,故j要減1。
                j--;
            }
        }
    }
    console.log(arr);
</script>

思緒二:

預備一個 空數組 res
    然後遍歷 arr
        假如 arr中這一項 在 res中不存在,
            則把這一項 放進 res中
        假如 存在
            什麼都不做
            
末了獲得的res,就是去重獲得后的數組。
<script>
    var arr = [2, 3, 1, 4, 2, 2, 3, 4, 1, 4, "1"]; // [2,3,1,4]
    var res=[2];
    for(var i=0;i<arr.length;i++){
        //返回值不等於-1則表明,res中沒有arr[i],這一項。
        if(compare(res,arr[i])!==-1){
           //往res中增加arr[i]這一項
            res.push(arr[i]);
        }
    }

    console.log(res);
    
    function compare(res,arr) {
        for(var j=0;j<res.length;j++) {
            //假如遍歷res歷程中有相等值的話,馬上返回-1,完畢遍歷。
            if(arr === res[j])
                return -1;
        }
        //假如for 輪迴完畢了,還沒跳出函數,示意res中沒有arr,則返回1。
        return j;
    }
</script>

思緒一和思緒二存在的瑕玷:假如數組內容中含有兩個NAN,因為NAN不等於它自己。故刪選不出來。

思緒三:

統計一切項湧現的次數,構成一個對象
        對象的鍵名 是 每一項的元素 ,
        對象的鍵值 是 該項湧現的次數.
末了我們只需要 統計一切的鍵名就能夠了
<script>
    var arr = [2, 3, 1, 4, 2, 2, 3, 4, 1, 4, 2]; // [2,3,1,4]
    var res={};
    var resArr=[];
    //    {
    //        2: 4,
    //        3: 2,
    //        1: 2,
    //        4: 3
    //    }

    for(var i=0;i<arr.length;i++){
        // 鍵名 in 對象
        // 假如對象中有此鍵名,則返回true
        // 不然,返回false
        if(arr[i] in res){
            //存在,則對應的鍵值+1。
            res[ arr[i] ]+=1;
        }else{
            //不存在,則設置對應鍵名,而且鍵值=1。
            res[ arr[i] ]=1;
        }
    }
    //遍歷對象
    for(i in res){
        //將鍵名插進去數組
        resArr.push(i);
    }
    console.log(resArr);
</script>

這個要領存在的題目就是:

1.假如數組中存在数字1,和字符串“1”,當遍歷鍵名的時刻,兩則是一樣的,獲得的數組會少了数字1.
2.鍵名是以字符串的體式格局存儲的,插進去數組的時刻,也是以字符串的體式格局存儲到數組中去。

革新思緒三

<script>
    var arr = [2, 2, 3, 4, 1, 4, 2,"1",undefined]; // [2,3,1,4]
    var res={};
    var resArr=[];
    //    {
    //        2: 4,
    //        3: 2,
    //        1: 2,
    //        4: 3
    //    }

    for(var i=0;i<arr.length;i++){
        //鍵名是 數據類型的前三位+arr[i]構成的字符串。
        temp=(typeof arr[i]).substr(0,3)+arr[i];
        if(temp in res){
            res[ temp ]+=1;
        }else{
            res[ temp ]=1;
        }
    }
    console.log(res);
    for(i in res){
        // 截取 鍵名的前三位
        // substr(0,3)包含最先,不包含完畢。截取的字符串 0,1,2位
        var temp=i.substr(0,3);
        if(temp=="num"){
            //截取 鍵名從第三位最先截取。
            resArr.push(Number(i.substring(3)));
        }
        if(temp=="str"){
            resArr.push(i.substr(0,3));
        }
        if(temp=="und"){
            resArr.push(undefined);
        }
    }
    console.log(resArr);
</script>

思緒四

運用 es6的Set ...
<script>
            var arr = [2, 3, 1, 4, 2, 2, 3, 4, 1, 4, 2, "1", NaN, NaN]; // [2,3,1,4]
            //Set要領能夠去除數組內反覆的
            // ... 表明睜開數組的每一項
            var res=[...(new Set(arr))];
            console.log(res);
        
</script>   
    原文作者:梁志芳
    原文地址: https://segmentfault.com/a/1190000015119121
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞