数组去重的几种方法对比¶
统计信息:字数 2076 阅读5分钟
数组去重分几种情况:数组的项全部是数值;数组的项全部是字符串;数组的项全部是对象;数组的长度
1 indexOf 去重¶
let array = [1, 2, 4, 2, 3];
function unique(array) {
let res = [];
const len = array.length;
for (let i = 0; i < len; i++) {
let current = array[i];
if (res.indexOf(current) === -1) {
res.push(current)
}
}
return res;
}
首先建立一个结果数组,然后遍历原始数组,判断 indexOf 如果结果数组中没有原始数组,把这一项加入。indexOf 消耗性能。
2 排序数组去重¶
如果一个数组已经排序,那么把数组看做单向链表,比较当前元素和下一个元素,如果重复直接去掉。性能较好
let array = [1, 2, 2, 2, 3];
function unique(array) {
const len = array.length;
for (let i = 0; i < len;) {
if (array[i] === array[i + 1]) {
array.splice(i + 1, 1);
} else {
i++;
}
}
return array;
}
扩展:多个排序数组合并后去重,使用多指针,将未重复的部分放在新数组中(或者原地数组中去重);
3 filter 去重¶
适合多种数据类型,需要过滤特殊值的排序(空值等)
let array = [1, 2, 1, 1, 'a', null, undefined];
function unique(array) {
return array.filter(function(item, index, array){
return (item && !isNaN(item) &&array.indexOf(item) === index);
});
}
4 对象去重¶
数组的每一项是对象
let array = [{value: 1}, {value: 1}, {value: 2}];
function unique(array) {
var obj = {};
return array.filter(function(item, index, array){
// console.log(typeof item + JSON.stringify(item))
if (obj.hasOwnProperty(typeof item + JSON.stringify(item))) {
return false;
}
return (obj[typeof item + JSON.stringify(item)] = true);
});
}
5 ES6 Set 去重¶
ES6 Set实现
// 这是最快捷的方法,适合于纯数值数组的去重,且不含有其他的属性
var unique = (a) => [...new Set(a)]
Last update:
November 9, 2024