JavaScript中数组去重的几种常用写法

172 阅读1分钟

(一)基于ES6中的Set方法

let ary = [12,23,12,15,25,23,25,14,16];
        ary = [...new Set(ary)];
        console.log(ary); //[12, 23, 15, 25, 14, 16]

(二)基于对象处理

        /* 
        unique:实现数组去重的方法
            参数:ary[Array] 要去重的数组
            返回值:[Array] 去重后的数组
         */
        function unique(ary){
        	//1.创建一个空对象
            let obj = {};
            //2.循环数组中的每一项,把每一项向对象中进行存储 ==> item:item
            for(let i = 0;i < ary.length;i++){
                let item = ary[i];
                //3.每一次存储之前进行判断:验证obj中是否存在这一项
                if(obj[item] !== undefined){
                    ary[i] = ary[ary.length-1];
                    ary.length--;
                    i--;
                    continue;
                }
                obj[item] = item;
            }
            return ary;
        }
        console.log(unique([12,23,12,33,45,33,23]));  //[12, 23, 33, 45]

(三)基于sort处理

		let ary = [1,2,1,1,4,3,3,2,1];
        ary = ary.sort();
        ary.forEach((item,index) => {
            ary.lastIndexOf(item) != index ? (ary.splice(index,ary.lastIndexOf(item) - index)) : null;
        });
        console.log(ary); //[1, 2, 3, 4]

(四)基于正则处理

		let ary = [12,23,12,15,25,23,25,14,16];
        ary.sort((a,b) => a - b);
        let str = ary.join('@') + '@';
        let reg = /(\d+@)\1*/g;
        ary = [];
        str.replace(reg,(n,m) => {
            m = Number(m.slice(0,m.length - 1));
            ary.push(m);
        });
        console.log(ary); //[12, 14, 15, 16, 23, 25]

(五)创建一个新数组方法

	方案一:
        let ary = [1,2,3,2,1,3,2,1];
        let newAry = [];
        for(let i = 0;i<ary.length;i++){
            //循环获取原有数组中的每一项
            let item = ary[i];
            //验证新数组中是否存在这一项
            if(newAry.includes(item)){
                //如果存在这一项,不再增加到新数组中,继续下一轮循环
                continue;
            }
            //新数组中不存在这一项,我们加入到新数组中
            newAry.push(item);
        }
        console.log(newAry); //[1, 2, 3]
     方案二:
        let ary = [1,2,3,2,1,3,2,1];
        let newAry = [];
        ary.forEach(item =>{
            if(newAry.includes(item)) return;
            newAry.push(item);
        });
        console.log(newAry); //[1, 2, 3]

(六)删除后面的重复项(不用includes/indexOf,这样保证兼容性)

		let ary = [1,2,3,3,2,1,1,2,4,2,1,3];
        for(var i = 0;i < ary.length;i++){
            //item:每一次循环拿出来的当前项
            //i:当前项的索引  i+1:代表后一项
            var item = ary[i];
            //让当前项和后面的每一项进行比较(循环)
            for(var j = i+1;j < ary.length;j++){
                //compare:后面拿出来要比较的每一项
                var compare = ary[j];
                //如果compare和item相等,说明这一项是重复的,我们把它删掉
                if(compare === item){
                    //j索引这一项要从数组中移除
                    ary.splice(j,1);
                    //数组塌陷了:j后面的每一项索引都提前了一位,下一次要比较的应该还是j这个索引的内容
                    j--;
                }
            }
        }
        console.log(ary); //[1, 2, 3, 4]