JavaScript 算法

数组去重的几种方式

几种我接触到的数组去重的方法

Wenyuan
2021-03-05
2 min

几种我接触到的数组去重的方法

# Set(ES6)

利用了Set集合中元素只会出现一次特性,将数组转换为Set集合,去重后再利用解构赋值生成新的数组,并返回。

function unique1(array) {
    return [...new Set(array)];
}
1
2
3

# Object 键值对

将数组中的所有元素作为对象的key和value存储在对象中,如果重复出现也不会创建新的记录。

缺陷:'8'8视为同一个值。

function unique2(array) {
    let obj = {};
    array.map(item => obj[item] = item);
    return Object.values(obj);
}
1
2
3
4
5

# map + indexOf

新建一个数组A,map遍历数组B,如果在A中没找到,则添加到A中,&&短路特性(如果前半条件不满足,后半则不执行)。

function unique3(array) {
    let arr = [];
    array.map(item => arr.indexOf(item) == -1 && arr.push(item));
    return arr;
}
1
2
3
4
5

# filter + lastIndexOf

对于每一个元素从后往前找,如果找到的下标不等于本身的下标,则说明有另一个重复元素,返回false,被filter过滤掉。

function unique4(array) {
    return array.filter((item, index) => array.lastIndex(item) == index);
}
1
2
3

# 排序 + 正则表达式

将数组每一项转换为@结尾再拼接的字符串;对这个字符串可以使用正则表达式,把重复出现部分替换为单项;再还原为数组,去掉最后一个空数据;最后把数字转换为Number,字符串不变。||逻辑运算符在前半为true的情况下不执行后半部分,如果item是字符串,前半的结果是NaN,隐式转换为Boolean,结果是false,执行后半部分,返回字符串本身。

缺陷:'8'8视为同一个值,true最后以字符串表示。

function unique5(array) {
    let str = array.sort().join('@') + '@';
    let arr = str.replace(/(\w@)\1*/g, "$1").split('@').slice(0, -1);
    return arr.map(item => item - 0 || item);
}
1
2
3
4
5

更佳的解决方案看:
JavaScript专题之数组去重