# JavaScript数组去重（12种方法，史上最全）

``````function unique (arr){
return Array.from(new Set(arr))
}

var arr =[1,1,'true','true',true,true,15,15,false,false,undefined,undefined,null,null,NaN,NaN,'NaN',0,0,'a','a',{},{}];
console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]
``````

``````functionunique(arr){
for(var i=0; i<arr.length;++){
for(var j=i+1; j<arr.length;j++){
if(arr[i]==arr[j]){
//第一个等同于第二个，splice方法删除第二个
arr.splice(j,1);
j--;
}
}
}
return arr;
}

var arr =[1,1,'true','true',true,true,15,15,false,false,undefined,undefined,null,null,NaN,NaN,'NaN',0,0,'a','a',{},{}];
console.log(unique(arr))
//[1, "true", 15, false, undefined, NaN, NaN, "NaN", "a", {…}, {…}]
//NaN和{}没有去重，两个null直接消失了
``````

``````function unique(arr){
if(!Array.isArray(arr)){
console.log('type error!')
return
}
var array =[];
for(var i =0;i < arr.length; i++){
if(array .indexOf(arr[i])===-1){
array .push(arr[i])
}
}
return array;
}

var arr =[1,1,'true','true',true,true,15,15,false,false,undefined,undefined,null,null,NaN,NaN,'NaN',0,0,'a','a',{},{}];
console.log(unique(arr))
// [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0, "a", {…}, {…}]  //NaN、{}没有去重
``````

``````function unique(arr){
if(!Array.isArray(arr)){
console.log('type error!')
return;
}
arr = arr.sort()
var arrry=[arr[0]];
for(var i =1; i <arr.length; i++){
if(arr[i]!== arr[i-1]){
arrry.push(arr[i]);
}
}
return arrry;
}

var arr =[1,1,'true','true',true,true,15,15,false,false,undefined,undefined,null,null,NaN,NaN,'NaN',0,0,'a','a',{},{}];
console.log(unique(arr))
// [0, 1, 15, "NaN", NaN, NaN, {…}, {…}, "a", false, null, true, "true", undefined]      //NaN、{}没有去重
``````

``````function unique(arr){
if(!Array.isArray(arr)){
console.log('type error!')
return
}
var arrry=[];
var obj ={};
for(var i =0;i <arr.length;i++){
if(!obj[arr[i]]){
arrry.push(arr[i])
obj[arr[i]]=1
}
else{
obj[arr[i]]++
}
}
return  arrry;
}

var arr =[1,1,'true','true',true,true,15,15,false,false,undefined,undefined,null,null,NaN,NaN,'NaN',0,0,'a','a',{},{}];
console.log(unique(arr))

//[1, "true", 15, false, undefined, null, NaN, 0, "a", {…}]    //两个true直接去掉了，NaN和{}去重
``````

``````function unique(arr){
if(!Array.isArray(arr)){
console.log('type error!')
return
}
var array =[];
for(var i =0; i <arr.length;i++){
if(!array.includes(arr[i])){//includes 检测数组是否有某个值
array.push(arr[i]);
}
}
return array
}

var arr =[1,1,'true','true',true,true,15,15,false,false,undefined,undefined,null,null,NaN,NaN,'NaN',0,0,'a','a',{},{}];
console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]
//{}没有去重
``````

``````function unique(arr){
var obj ={};
return arr.filter(function(item, index,arr){
return obj.hasOwnProperty(typeof item +item)? false:(obj[typeof item + item]=true)
})
}
var arr =[1,1,'true','true',true,true,15,15,false,false,undefined,undefined,null,null,NaN,NaN,'NaN',0,0,'a','a',{},{}];
console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}]
//所有的都去重了
``````

``````function unique(arr){
return arr.filter( function(item, index,arr){//当前元素，在原始数组中的第一个索引==当前索引值，否则返回当前元素
return arr.indexOf(item,0)===index;
});
}

var arr =[1,1,'true','true',true,true,15,15,false,false,undefined,undefined,null,null,NaN,NaN,'NaN',0,0,'a','a',{},{}];
console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, "NaN", 0, "a", {…}, {…}]
``````

``````function unique(arr){
var array= arr;
var len = array.length;
array.sort(function(a,b){//排序后更加方便去重
return a -b;
})
function oop(index){
if(index >=1){
if(array[index]===array[index-1){
array.splice(index,1);
}
loop(index -1);//递归loop，然后数组去重
}
}
loop(len-1);
return array;
}

var arr =[1,1,'true','true',true,true,15,15,false,false,undefined,undefined,null,null,NaN,NaN,'NaN',0,0,'a','a',{},{}];
console.log(unique(arr));
//[1, "a", "true", true, 15, false, 1, {…}, null, NaN, NaN, "NaN", 0, "a", {…}, undefined]
``````

``````function arrayNonRepeatfy(arr){
let map = new Map();
let array = new Array();// 数组用于返回结果
for(let i =0;i <arr.length;i++){
if(map .has(arr[i])){// 如果有该key值
map.set(arr[i],true);
}
else{
map .set(arr[i],false);// 如果没有该key值
array.push(arr[i]);
}
}
return array ;
}
var arr =[1,1,'true','true',true,true,15,15,false,false,undefined,undefined,null,null,NaN,NaN,'NaN',0,0,'a','a',{},{}];
console.log(arrayNonRepeatfy(arr))
//[1, "a", "true", true, 15, false, 1, {…}, null, NaN, NaN, "NaN", 0, "a", {…}, undefined]
``````

``````function unique(arr){
return arr.reduce((prev,cur)=> prev.includes(cur)?prev :[...prev,cur],[]);
}
var arr =[1,1,'true','true',true,true,15,15,false,false,undefined,undefined,null,null,NaN,NaN,'NaN',0,0,'a','a',{},{}];
console.log(unique(arr))
// [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]
``````

``````[...new Set(arr)]
//代码就是这么少----（其实，严格来说并不算是一种，相对于第一种方法来说只是简化了代码）
``````

PS：有些文章提到了foreach+indexOf数组去重的方法，个人觉得都是大同小异，所以没有写上去。 END

### 推荐阅读更多精彩内容

• 数组去重，一般都是在面试的时候才会碰到，一般是要求手写数组去重方法的代码。如果是被提问到，数组去重的方法有哪些？你...
程序员BUG阅读 244评论 0 3
• ES6 http://es6.ruanyifeng.com 目录 1 let 和 const 命令 2 变量的解构...
雪夜不下雪阅读 6,596评论 0 41
• 数组去重，一般都是在面试的时候才会碰到，一般是要求手写数组去重方法的代码。如果是被提问到，数组去重的方法有哪些？你...
grain先森阅读 2,905评论 6 134
• 数组去重，一般都是在面试的时候才会碰到，一般是要求手写数组去重方法的代码。如果是被提问到，数组去重的方法有哪些？你...
怪兽别跑biubiubi阅读 19评论 0 0
• 一、利用ES6 Set去重（ES6中最常用） functionunique(arr){ returnArray.f...
程序人生_小龙阅读 312评论 0 0