# 1. ES6 语法 new Set() 方法去重
ES6 提供了新的数据结构 Set
。它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set
本身是一个构造函数,用来生成 Set
数据结构。
利用的算法类似 '===',与 '===' 的区别是 ‘===’ 认为 NaN != NaN
,set
的算法认为它们是相等的。
但 Set
不支持对象方法,认为对象都是不相等的。
let arr = new Set( [1,2,2,3,3,4,5,6]);
let newArr = Array.from(arr);
console.log(newArr); // [1,2,3,4,5,6]
console.log([...arr ]); // [1,2,3,4,5,6]
# 2. 使用 splice方法嵌套双重 for 循环去重(ES5常用)
原理:splice
会改变原数组
function unique(){
for(let i = 0; i < arr.length; i++){
for(let j = i+1; j < arr.length; j++){
if(arr[i] === arr[j]){
arr.splice(j, 1);
j--;
}
}
}
return arr;
}
# 3. 利用 indexof / includes 与 forEach 去重
function unique(arr){
let _arr = [];
arr.forEach((item, index)=>{
if( _arr.indexOf(arr[index]) === -1) // 或者 if( !_arr.includes(arr[index]) )
_arr.push(arr[index]);
})
return _arr;
}
# 4. 利用数组的 filter 方法去重
filter()
方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素
indexOf ( searchvalue, fromindex )
searchvalue
:必填值,规定需检索的字符串值
fromindex
:选填值,规定在字符串中开始检索的位置。它的合法取值是 0 到 stringObject.length - 1。
如省略该参数,则将从字符串的首字符开始检索。
function unique(arr){
let _arr = arr.filter((item, index)=>{
// 如果新数组的当前元素的索引值 == 该元素在原始数组中的第一个索引,则返回当前元素
return arr.indexOf(item, 0) === index;
});
return _arr;
}
# 5. 利用数组的 sort() 方法去重
原理:相邻元素对比法,若相等则去掉一个
注:array.sort( function ) 参数必须是函数,可选,默认升
function unique(arr){
arr = arr.sort()
let _arr = [];
for(let i = 0; i < arr.length; i++){
if(arr[i] !== arr[i+1])
_arr.push( arr[i] )
}
return _arr;
}
# 6. 利用 函数递归 结合 sort 和 splice 去重
function unique(arr){
arr = arr.sort();
let fn = (index)=>{
if( index >=1 ){
if(arr[index] === arr[index - 1])
arr.splice(index, 1);
fn(index - 1);
}
}
fn(arr.length-1);
return arr;
}
# 7. 利用 reduce 结合 includes 去重
function unique(arr){
return arr.reduce((prev, cur)=>{
return prev.includes(cur) ? prev : [...prev, cur]
}, [])
}
# 8. 利用 Map数据结构 去重
function unique(arr){
let map = new Map(), _arr = [];
for(let i = 0; i < arr.length; i++){
if(!map.has(arr[i])){
map.set(arr[i], true)
_arr.push(arr[i])
}
}
return _arr;
}
网友评论