快速入门!JavaScript数组去重的几种方法

数组去重的几种方法

方法一:
对象键值对处理(推荐)
let ary = [1, 2, 3 ,2 ,1 ,3 ,3 ,1 ,2];
// 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.splice(i,1);
    i--;
    continue;
    }
    obj[item] = item;
}
console.log(obj);  ==>[1,2,3]
方法二:
include方法检测是否存在当前项
let ary = [1, 2, 3 ,2 ,1 ,3 ,3 ,1 ,2];
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]
方法三:
基于ES6的Set(对应的Map)实现去重(最简单,如需快速去重)
let ary = [12, 23, 12, 15, 25, 23, 25, 14, 16];
ary = [...new Set(ary)];
console.log(ary);  ==>[1,2,3]
方法四:
不创建空数组 不使用includes/indexOf等IE6/7/8不兼容的方法,该方法存在数组塌陷问题( 在对数组进行操作的时候,会使数组的长度产生变化,同时操作的数组那个项的下一个索引会被跳过,从而造成数组的某项会被跳过,这种叫做数组塌陷现象。),所以在删除 j 项后,做一次j–,来解决此问题。
var ary = [1, 2, 3 ,2 ,1 ,3 ,3 ,1 ,2];
for (var i= 0; i<ary.length;i++){
    var item = ary[i];
    for (var j = i+1; j<ary.length;j++){
        var compare = ary[j];
        if(compare === item){
        ary.splice(j,1);  // 基于splice实现的删除性能不好,当前项被删除后,后面每一项的索引都要向前提一位,如果后面内容过多,一定影响性能 
        j--;  // (数组塌陷问题)
        }
    }
}
console.log(ary);  ==>[1,2,3]

方法五:
利用排序+正则
let ary = [1, 2, 3 ,2 ,1 ,3 ,3 ,1 ,2];
ary.sort((a, b) => a - b);
let str = ary.join('@') + '@'; // 将数组转化成完整格式的字符串=> "[数字]+@"的一组字符串
let reg = /(\d+@)\1*/g;
ary = [];
str.replace(reg, (n, m) => {
// n参数为正则匹配到的内容如"1@1@1@"
// m参数为n中被匹配到的字符串"1@"
// 如果存在第三个参数,那么它是字符串被匹配到第一次的索引
m = Number(m.slice(0, m.length - 1));
ary.push(m);
});
console.log(ary);  ==>[1,2,3]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值