JS 数组去重的方法

方法一:多层循环比较

利用splice的特性,比较两个数是否相同,获得相同元素的下标,删除相同元素,改变原数组,获得去重后的数组

function uniqueArr(arr){
            for(var i = 0;i < arr.length ;i++){
                for(var j = i + 1;j < arr.length - 1; j++){
                    if(arr[i] == arr[j]){
                        arr.splice(j,1);
                    }
                }
            }
            return arr;
        }

方法二:利用indexOf()

设置一个新的数据用来接收数据,利用indexOf 来判断 数据是否存在于 新数组中,不存在,则添加进去,获得去重后的新数组

function uniqueArr(arr){
            var newArr = [];
            for(var i = 0;i < arr.length;i++){
                if(newArr.indexOf(arr[i]) < 0){
                    newArr.push(arr[i]);
                }
            }
            return newArr;
        }

方法三:对象键值对法

定义一个对象,用数组中的元素作为对象属性名,如果对象名不存在,那么将该元素添加到新数组中,给对应的属性值 设置 一个值作为标记,不一定为1,获得去重后的新数组

function uniqueArr(arr){
            var obj = {};
            var newArr = [];
            for(var i = 0;i < arr.length;i++){
                if(!obj[arr[i]]){
                    obj[arr[i]] = 1;
                    newArr.push(arr[i]);
                }
            }
            return newArr;
        }

      function uniqueArr(arr,attr){
        var attr_arr = [];
        var newArr = [];
        arr.forEach(function(item,index){
          if(attr_arr.indexOf(item[attr]) < 0){
            newArr.push(item);
            attr_arr.push(item[attr]);
          }
        })
        return newArr;
      }

方法四:

定义一个新数组,将 arr 的第一个值添加到新数组中作为比较对象,遍历从数组的第二个值开始逐一比较 push 后的新数组中每个元素比较,看是否有相同的,不同就添加,获得不重复新数组

function uniqueArr(arr){
            var newArr = [arr[0]];
            for(var i = 1;i < arr.length;i++){
                var flag = false;
                for(var j = 0;j < newArr.length;j++){
                    if(newArr[j] === arr[i]){
                        flag = true;
                        break;
                    }
                }
                if(!flag) newArr.push(arr[i]);
            }
            return newArr;
        }

方法五:先排序,再相邻两两比较

function uniqueArr(arr){
            arr.sort();
            for(var i = 0;i < arr.length;i++){
                if(arr[i] === arr[i-1]){
                    arr.splice(i,1);
                }
            }
            return arr;
        }

方法六:利用indexOf和 lastIndexOf方法判断

利用indexOf() 方法的特性,从数组下标0开始查找元素,返回第一次出现位置的下标,lastIndexOf() 从数组末尾开始查找元素,返回从后向前找到元素的第一次出现位置的下标。
如果从数组开始进行查找 的元素和从后进行查找的元素 下标相同,表示找到的是同一个元素。

function uniqueArr(arr){
            for(var i = 0;i < arr.length;i++){
                if( arr.indexOf(arr[i]) !== arr.lastIndexOf(arr[i])){
                    arr.splice(arr.lastIndexOf(arr[i]),1);
                }
            }
            return arr;
        }

方法七:ES6 Set()方法

new Set() 方法不允许有重复数据,但是返回的是一个类数组,所以要用 Array.from()方法转换成数组

function uniqueArr(arr){
            return Array.from(new Set(arr));
        }