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;
            }
     
     
       //觉得这篇文章有用的  帮我点点赞啊,一个赞你买不了吃亏你买不了上当,你啥也买不了
  • 相关阅读:
    ABP官方文档翻译 3.4 领域服务
    ABP官方文档翻译 3.3 仓储
    ABP官方文档翻译 3.2 值对象
    ABP官方文档翻译 3.1 实体
    ABP官方文档翻译 2.7 对象到对象的映射
    ABP官方文档翻译 2.6 定时
    bootstrap 源码中部分不了解的css属性
    vue 父组件调用子组件事件/子组件调用父组件方法
    js性能优化问题学习笔记
    js递归性能影响及解决方案
  • 原文地址:https://www.cnblogs.com/suihang/p/9464182.html
Copyright © 2011-2022 走看看