在以往工作中,一遇到数组去重,一般都会用下面的几个方法
一、双重循环(被去重数组和结果数组)去重
代码语言:js复制const ary = [];
for (let i = 0; i < array.length; i ) {
let isDuplicate = false;
for (let j = 0; j < i; j ) {
if (array[i] === array[j]) {
isDuplicate = true;
break;
}
}
if (!isDuplicate) {
ary.push(array[i]);
}
}
二、简单对象记录元素是否存在
代码语言:js复制const result = [];
const tmp = {};
for (let i = 0; i < array.length; i ) {
const item = array[i];
if (!tmp[item]) {
result.push(item);
tmp[item] = true;
}
}
上面两种方法是最原始的去重方法了,现在基本不用了
三、利用ES6的reduce方法去重
代码语言:js复制const ary = array.reduce((result, current) => {
return result.includes(current) ? result : [...result, current];
}, []);
这个方法比较常用,因为它可以去重基础数据类型组成的数组,也可以去重对象或数据类型数据组成的数组,如:
代码语言:js复制const ary = array.reduce((result, current) => {
const isExsist = result.some(item => item.name === current.name);
return isExsist ? result : [...result, current];
}, []);
四、利用ES6的新增数据类型Set去重
代码语言:js复制const ary = [...new Set(array)];
// OR
const ary2 = Array.from(new Set(array))
充分利用Set的不重复特性来达到去重的目的
直到最近,我收到了某公众号推送的一条消息,标题叫“一个让面试官对你产生好感的数组去重方法”,点进去之后,确实有让我耳目一新的感觉,废话不多说,先看代码
代码语言:js复制const ary = array.filter((item, index, originArray) => {
return originArray.indexOf(item) === index;
});
看懂了代码后,第一感觉是,在我没全面使用es6之前,我怎么就不知道还有这个方法来去重。
这个方法充分利用了数组的indexOf方法的特点,那就是它永远只会返回第一个被查找元素的索引,那么,在filter方法中,非第一个的就会被过滤掉,真的不得不服有些人的举一反三的能力,有了这个方法,就算不适用es6的filter方法,也可以只遍历一次原数组就可以去重了
代码语言:js复制const result = [];
array.forEach((item, index) => {
if(array.indexOf(item) === index) {
result.push(item)
}
});