数组去重的方法都有哪些?

192 阅读3分钟

数组去重的方法都有哪些?

本篇文章主要目的就是对数组去重的方法的集合。 对于数组的去重,还是有许多方法的,以下仅仅是其中一些。

  • 第一种:for循环
  • 第二种:filter() + indexof()
  • 第三种:forEach + indexOf
  • 第四种:forEach + includes
  • 第五种:先排序 再两两比较 不相等再放进去
  • 第六种:排序,遍历数组,判断元素是否与新数组最后元素相等
  • 第七种:借用一个空对象{}
  • 第八种:Set
  • 第九种:forOf + Set

第一种:for循环

for循环是我们最容易想到的一个方法。 for循环主要思路:双层循环,若内层循环的元素与外层循环的元素arr[i]相等,那么需要将arr[j]这个元素去掉。 代码如下:

    let arr=[11,88,22,33,44,55,44,33,22,11];
    for(let i=0;i<arr.length;i++){
        for(let j=i+1;j<arr.length;j++){
            if(arr[i]===arr[j]){
                arr.splice(j,1);
            }

        }
    }
    console.log(arr);

也可以把循环封装到一个函数里面

    let arr=[11,88,22,33,44,55,44,33,22,11];
    function uniqueArr(array){
        let newArr=[];
        // 定义一个变量 看元素是否重复
        let isRepeat;
        for(let i=0;i<array.length;i++){
            isRepeat=false;
            for(let j=0;j<newArr.length-1;j++){
            // 若遍历过程中出现相同元素,则给isRepeat赋值为true
                if(newArr[j]==array[i]){
                    isRepeat=true;
                    break;
                }
            }
            // 只有当isRepeat为false的时候,将array[i]元素存储到新的数组里面
            if(!isRepeat)
                newArr.push(array[i]);
        }
        return newArr;
    }
    console.log(uniqueArr(arr));

可以将去重的代码封装到一个函数里:

<script>
    let arr5=[11,88,22,33,44,55,44,33,22,11];
    function uniqueArr(array){
        let newArr=[];
        let isRepeat;
        for(let i=0;i<array.length;i++){
            isRepeat=false;
            for(let j=0;j<newArr.length-1;j++){
                if(newArr[j]==array[i]){
                    isRepeat=true;
                    break;
                }
            }
            if(!isRepeat)
                newArr.push(array[i]);
        }
        return newArr;
    }
    console.log(uniqueArr(arr5));
</script>

第二种:filter() + indexof()

filter( function(currentValue,index,arr), thisValue) 作用:起到筛选数据的作用 会创建一个新数组,原数组的每个元素传入回调函数中,若返回值为return true,则这个元素保存到新数组中;若return false,则该元素不保存到新数组中;原数组不发生改变。filter也有过滤的作用,会把满足要求的数据过滤出来。

indexOf(searchvalue,fromindex) 作用:查找字串中指定字符或字串首次出现的位置,返首索引值,若找不到返回-1. 第一个参数是要检索的字符串值,第二个参数是在整体字符串中开始检索的位置。

代码如下:

<script>
    // filter indexOf 高阶函数
    // filter()若return若返回true,则元素保存到新数组中;否则不保存;返回新数组,原数组不发生改变
    // indexOf() 查找字串中指定字符或字符串首次出现的位置,返首索引值
    let arr1=[11,88,22,33,44,55,44,33,22,11];
    let newArr1=arr1.filter(function(element,index,self){
        return self.indexOf(element)==index;
    });
    console.log(newArr1);
</script>

第三种:forEach + indexOf

<script>
    // 遍历数组元素 indexOf查找此元素是否属于新数组,
    // 若不属于返回-1,若返回-1,将此元素存进新数组
    let arr6=[11,88,22,33,44,55,44,33,22,11];
    function uniqueArr(array){
        let newArr6=[];
        array.forEach(item=>{
            if(newArr6.indexOf(item)==-1){
                newArr6.push(item);
            }
        })
        return newArr6;
    }
    console.log(uniqueArr(arr6));
</script>

第四种:forEach + includes

includes()方法:确定数组是否包含指定的元素。

如果数组包含元素,则此方法返回 true,否则返回 false。

    // .includes 找到返回true 否则 false
    // 遍历 若newArr8.includes() 没找到,则将数据存储到新数组
    let arr8=[11,88,22,33,44,55,44,33,22,11];
    function uniqueArr(array){
        let newArr8=[];
        arr8.forEach(item=>{
            if(!newArr8.includes(item)){
                newArr8.push(item);
            }
        })
        return newArr8;
    }
    console.log(uniqueArr(arr8));
</script>

第五种:先排序 再两两比较 不相等再放进去

<script>
    // 先对数组进行.sort()升序排序 再两两进行比较
    // 若array[i]==array[i+1]则不保存array[i]
    // 若array[i]!=array[i+1],则将array[i]存入到新数组中
    let arr7=[11,88,22,33,44,55,44,33,22,11];
    function uniqueArr(array){
        arr7.sort();
        let newArr7=[];
        for(let i=0;i<array.length;i++){
            if(array[i]!=array[i+1]){
                newArr7.push(array[i]);
            }
        }
        return newArr7;
    }
    console.log(uniqueArr(arr7));
</script>

第六种:排序,遍历数组,判断元素是否与新数组最后元素相等

先进行排序,再遍历数组,并判断遍历元素是否与新数组的最后一个元素相等,若不等则将遍历元素存储到新数组

<script>
    let arr9=[11,88,22,33,44,55,44,33,22,11];
    function uniqueArr(array){
        let newArr9=[];
        arr9.sort();
        arr9.forEach(item=>{
            if(newArr9[newArr9.length-1]!=item)
                newArr9.push(item);
        })
        // for(let i=0;i<array.length;i++){
        //     if(newArr9[newArr9.length-1]!=array[i])
        //         newArr9.push(array[i]);
        // }
        return newArr9;
    }
    console.log(uniqueArr(arr9));
</script>

第七种:借用一个空对象{}

<script>
    // 遍历数组,创建一个空对象,
    // 把数组元素作为此对象的键名
    // 判断 若对象中没有此元素为键名的属性,给对象赋新的属性,并赋值为true
    // 并把此元素存储到新数组
    let arr10=[11,88,22,33,44,55,44,33,22,11];
    function uniqueArr(array){
        let newArr10=[];
        let temp={};
        for(let i=0;i<=array.length-1;i++){
            if(!temp[array[i]]){
                temp[array[i]]=true;
                newArr10.push(array[i]);
            }
        }
        return newArr10;
    }
    console.log(uniqueArr(arr10));
</script>

第八种:Set

在ES6中增加了Set数据结构,只能用new创建,不能通过字面量创建。

Set 类似数组,不能存储重复元素,一种新的数据类型,不是数组,不是对象。

若存储的数据重复,会自动去除

<script>
    let arr3=[11,88,22,33,44,55,44,33,22,11];
    let set1=new Set(arr3);
    let newArr3=[...set1];
    console.log(newArr3);

</script>

第九种:forOf + Set

数组是可迭代对象,可以用forOf. forOf可以还换成for循环、forEach

<script>
    let arr4=[11,88,22,33,44,55,44,33,22,11];
    let set2=new Set(arr4);
    let newArr4=[];
    for(let item of set2){
        newArr4.push(item);
    }
    console.log(newArr4);
</script>