zoukankan      html  css  js  c++  java
  • JS中数组去重的九方法

            数组去重方法
           方法一:运用set结构特点:存储的数据没有重复的,结果为对象,再用Array.from()转换成数组
     
      
            var arr = [1,1,2,1,3,4,5];
            var set = new Set(arr);
            console.log(Array.from(set))
            方法二 用ES5新增的indexOf()和push()方法 (非常简便好理解)
               function norepeat(arr){
                  var newarr = [];
                  for(var i in arr){
                      if(newarr.indexOf(arr[i]) == -1){
                          newarr.push(arr[i]);
                      }
                  }
                  return newarr;
               }
     
      方法三 运行indexOf()判断每个值第一次出现的位置和当前i的值是否相等
               function norepeat(arr){
                  var newarr = [arr[0]];  //默认加入第一个数  因为第一个数没比较的必要
          for(var i =1;i<arr.length;i++){
            if(arr.indexOf(arr[i])==i){
              newarr.push(arr[i])
                }
        }
                  return newarr;
               }
     
      
           方法四:利用对象的属性唯一   (速度快,占空间多,用空间来换时间)
          var res = [];
          var obj = {};
          for(var i=0; i<arr.length; i++){
              if( !obj[arr[i]] ){
                  obj[arr[i]] = 1;
                  res.push(arr[i]);
                   }}
      
            方法五:先利用sort排序再比较相邻的是否相等,相等则删除
            function norepeat(arr) {
                arr.sort(function (a, b) { return a - b; });
                for (var i = 0; i < arr.length; i++) {
                    if (arr[i] == arr[i + 1]) {
                        arr.splice(i, 1);
                        i--;
                    }
                }
                return arr;
            }
                 注意:不加 i-- 则会删除后,跳过一个数字
     
     
     
     
            方法六:运用splice()方法和双层for循环(有点类似选择排序)
                function norepeat(arr){
                    for(var i = 0;i < arr.length-1;i++){
                        for(var j = i+1;j<arr.length;j++){
                            if(arr[i] == arr[j]){
                                arr.splice(j,1);
                                j--;
                            }
                        }
                    }
                    return arr;
                }
                 注意:不加 j-- 则会删除后,跳过一个数字


            方法六第二种写法 效率低,会增加大量无用的循环比较
            function norepeat(arr){
                    var newArr = arr;
                    for(var i = newArr.length;i > 0 ; i--){
                        for(var j = 0; j<i ; j++){
                            if(newArr[i] == newArr[j]){
                                newArr.splice(i,1);
                            }
                        }
                    }
                    return arr;
                }
     
     
            方法七:利用数组下标不能重复,先将参数里的值转化成一个数组的下标,再将下标重新转化成值(非常棒的思路)
            function norepeat(arr){
                var newArr = [];
                var arrs = [];
                for(var i=0;i<arr.length;i++){
                    var a = arr[i];
                    newArr[a] = 1;
                }
    
                for(var i in newArr){
                    arrs[arrs.length] = i;
                    console.log(i);
                }
    
            }

      方法八:先排序再用递归进行比较删除
      
            function Digui(arr) {
                // 获取长度
                var len = arr.length;
                //对数组进行排序才能方便比较
                arr.sort(function (a, b) {
                 return a - b;
                })
                // 用递归的方法进行去重
                function loop(index) {
                    if (index >= 1) {
                        if (arr[index] === arr[index - 1]) {
                            arr.splice(index, 1);
                        }
                        loop(index - 1); //递归loop函数进行去重
                    }
                }
    
                loop(len - 1);
                return arr;
            };
        

            方法九也可以实现
            var arr = [6, 1, 1, 2, 1, 2, 1, 1, 3, 1, 1, 1, 4, 15];
            function norepeat(arr) {
                var arrcopy = [];
                for (var i = 0; i < arr.length; i++) {
                    var count = 0;
    
    
                    for (var j in arrcopy) {
                        if (arrcopy[j] != arr[i]) {
                            count++;
    
                        }
                    }
                    console.log(arrcopy);
                    if (count == arrcopy.length) {
                        arrcopy[arrcopy.length] = arr[i];
                    }
                }
                return arrcopy;
            }
     
     
       //觉得这篇文章有用的  帮我点点赞啊,一个赞你买不了吃亏你买不了上当,你啥也买不了
  • 相关阅读:
    HDU 1850 Being a Good Boy in Spring Festival
    UESTC 1080 空心矩阵
    HDU 2491 Priest John's Busiest Day
    UVALive 6181
    ZOJ 2674 Strange Limit
    UVA 12532 Interval Product
    UESTC 1237 质因子分解
    UESTC 1014 Shot
    xe5 android listbox的 TMetropolisUIListBoxItem
    xe5 android tts(Text To Speech)
  • 原文地址:https://www.cnblogs.com/suihang/p/9464182.html
Copyright © 2011-2022 走看看