数组去重

99封情书 提交于 2021-01-10 01:49:28

利用两个for循环和push方法

思路:利用两个for循环.遍历数组中的每一项,对每一项又遍历这项后面的每一项。也就是将当前元素与他后面的所有元素作比较,只要碰到与当前元素相等的情况,利用j = ++i重新开始外层大循环。直到其后面没有重复的元素就push进新数组

    <script type="text/javascript">
        function distinct(arr){
            var result = [],
            len = arr.length;
          for(var i = 0; i < len; i++){
            for(var j = i + 1; j < len; j++){
                if(arr[i] === arr[j]){
                    j = ++i;//i和j分别加1,外层大循环重新开始
                }
            }
            result.push(arr[i]);
          }
         return result;
        }
        var arra = [1,2,3,4,4,1,1,2,1,1,1];
        console.log(distinct(arra));    //返回[3,4,2,1]
    
</script>

利用两个for循环和splice方法

思路 对数组中的每一项,与该项后面的每一项比较,若相同,就删掉后面的相同项

    <script type="text/javascript">
         function distinct(arr){
            var len = arr.length;
            for(var i = 0; i < len; i++){
                for(var j = i + 1; j < len; j++){
                if(arr[i] == arr[j]){
                     arr.splice(j,1);
                     len--;
                     j--;// 进行下一次遍历
                }
            }
            }
             return arr;
        };
        var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,];
        var b = distinct(a);
        console.log(b); //1,2,3,4,5,6,56
    
</script>

利用sort和splice

思路:先用sort方法将数组排序,然后在老数组中循环遍历,将当前项与他的后一项比较,如果相等就删除当前项,并且进行i--和len--继续遍历

    <script type="text/javascript">
        function distinct(arr{
            var len=arr.length;
            arr.sort((a,b) => a - b ); // 对数组进行排序
            for(var i = 0;i < len;i ++ ){
                if(arr[i] == arr[i+1]){
                    arr.splice(i,1); // 删掉当前项
                    len--;
                    i--;
                }
            }
            return arr;
        };
        var arra = [1,2,3,4,4,1,1,2,1];
        var b = distinct(arra);
        console.log(b); // [1,2,3,4]
    
</script>

利用对象属性的不重复性

思路:利用对象的属性不能相同的特性.将数组中的每一项当做对象的属性名,属性名是不可以重复的。新建一个对象obj,遍历数组中的每一项,如果!obj[arr[i]]为true,就将该值push进结果数组

    <script type="text/javascript">
        function distinct(arr{
            var i;
            var obj = {};
            var result = [];
            var len = arr.length;
            for(i = 0;i < len;i ++){
                if(!obj[arr[i]]){
                    obj[arr[i]] = 1;//通过变量访问属性,用[]
                    result.push(arr[i]);
                }
            }
            console.log(obj);
            return result;
        };
        var a = [1,4,6,4,4,4,4,4,6,1,1]
        var b = distinct(a);
        console.log(b); // [1,4,6]
    
</script>

利用indexOf和push

思路:对于老数组中的每一项,在新数组中进行查找,如果没有(返回-1),push进去

    <script type="text/javascript">
         function distinct(arr{
            var i;
            var len = arr.length;
            var res = [];
            // for(i = 0;i < len;i ++){
            //  if(res.indexOf(arr[i]) === -1){
            //      res.push(arr[i]);
            //  }
            // }
            // 可以用forEach(或者map\filter)代替上面的for循环,注意传入的函数的三个参数分别为item,index,array
            arr.forEach(function(item){
                if(res.indexOf(item) === -1){
                    res.push(item);
                }
            })
            return res;
        };
        var arra = [1,2,4,2,1,24,4,3,4,2,1,3,3];
        var arrb = distinct(arra);
        console.log(arrb);
    
</script>

利用set对象和拓展运算符

思路:ES6中的set是一个类似于数组的对象,其属性不能重复。利用Array.from或者拓展运算符将其转化为数组

    <script type="text/javascript">
        function distinct(array){
            // return Array.from(new Set(array));
            return [... new Set(array)]//用[...A]将A转换为数组
        }
        var arr1 = [2,1,2,2,1,34,3,5,54,221,1,1,2,3,12];
        var arr2 = distinct(arr1);
        console.log(arr2);
    
</script>


本文分享自微信公众号 - 国产程序员(Monday_lida)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!