数组去重方法与是够改变原数组

数组方法是否改变原数组

这里只需要记住一句话即可,针对数组中增删改翻的方法都是会改变原数组,其它的则是返回新数组或者返回布尔值索引等

  • 增加元素:push()添加到末尾,unshift()添加到开头
  • 删除元素:shift()删除第一个,pop()删除最后一个
  • splice比较特殊,既可以删除也可以添加。splice(2, 0, "hello", [6, 7, 8]);// 第一个参数表示从第2位开始;第二个参数表示删除0个;第三个参数开始为要添加的元素,可以是数组,可以只做删除操作,方便快捷
  • sort(),reverse()翻转数组也会改变原数组
  • slice是截取数组某一段,也是一个不改变原数组的方法
  • 数组的其它方法附图

数组去重的方法(散发:相反可以获取重复的值)

这里先介绍简单快捷的方法

  1. set与Array.from去重(利用set值不重复与数组原生转化方法)

    Array.from(new Set(arr))
    
  2. 利用解构赋值与set

    let arr1 = [...new Set(arr)]
    
  3. 利用filter与indexOf去重

    array.filter((item,index,arr)=>{
     //indexOf的索引等于值本身的索引就返回
        //0表示开始查找位置,默认也是0,可以省略
        return arr.indexOf(item,0) === index;
    })
    
  4. 利用indexOf方法去重(for循环遍历,forEach/map均可实现,但for循环效率高)

    for(var i=0;i<array.length;i++){
     //不存在就返回-1,就将值添加进新数组   
    	if(array1.indexOf(array[i]) === -1) {
            array1.push(array[i]);
        }
        return array1;
    }
    
  5. 利用includes去重(原理和indexOf一致)

    //includes()存在就返回true,不存在就返回false
    //在效率对比中,for>foreach>map>for..in,使用for更为妥当
    for(var i=0;i<array.length;i++){
        if(!array1.includes(array[i])){
            array1.push(array[i])
        return array1;
    }
    

较为复杂或者有缺陷的方法

  1. 利用for双循环以及splice()进行去重

    //原理:先将数组遍历一遍,再将每一个值对数组再遍历一遍,相同就删除
    for(var i=0,length=array.length;i<array.length;i++){
        for(var j=0,length=array.length;j<array.length;j++){
            if(array[i]===array[j]){
             //如果后面有相同的值就删除
                array.splice(j,1);
                j--;	 //删除一个数之后,j值-1
                length--;//删除之后长度-1,减少循环次数,节省性能
            }
        }
    }
    
  2. 利用sort进行去重(存在局限性,了解即可)

    function repeat( array ){
                        array = array.sort();
                        console.log(array);
        
                        var array1 = [array[0]];
                        for(var i=1,leng=array.length;i<leng;i++){
                            if(array[i] !== array[i-1]){
                                array1.push(array[i]);
                            }
                        }
                        return array1;
                    }
                    console.log(repeat(array));
    
  3. 利用对象属性不能相同进行去重(普通对象,Map对象)

    1. 利用Map属性值不一致进行去重,将数组值设置为Map属性

      let map = new Map();
      let array1 = [];
      for(let i=0;i<array.length;i++){
      //通过对象方法has判断是否存在此属性key    
          if(map.has(array[i])){
              map.set(array[i],true);
          }else {
        //不存在就将值设置为false   
              map.set(array[i],false);
              array1.push(array[i]);
          }
          //完成之后可以通过map了解哪几个重复
      }
      
    2. 利用对象属性不重复(存在缺陷,了解即可)

        function repeat(array){
           var array1 = [];
           var obj = {};
           for(var i=0,leng=array.length;i<leng;i++){
                if(!obj[array[i]]){
                    array1.push(array[i]);
                    obj[array[i]] = 1;
                }
                else{
                    obj[array[i]]++;
                }
            }
            return array1;
        }
      

​ 4.利用递归进行数组去重

//针对数字类型,先升序排序,如果相同那么肯定相邻
//index从数组最后开是进行比较,相邻相同就删除,并且次数-1,提高效率
var array1 = array;
var length = array1.length;
array1.sort((a,b)=>{
    //小于0就排前面,升序
    return a-b
})
//递归函数loop
function loop(index){
    if(index>=1){
        if(array1[index]===array1[index-1]){
            array1.splice(index,1)
        }
        loop(index-1);
    }
    //进行递归
    loop(length-1);
    return array1;
}
posted @ 2022-10-25 22:23  YYYang333  阅读(143)  评论(0)    收藏  举报