js数组去重方法(处理{}和NaN结果不同)

1、利用es6中set唯一(不能去掉重复的{})

[].from(new Set([1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}]));
[...new Set([1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}])]
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]  length:13

2、es5的Array filter()+indexOf() (不能去掉重复的{})

[1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}].filter(function(elem,index,Array){
   return index === Array.indexOf(elem);
})
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]  length:13

3、基础写法1(不能过滤NaN和{})

function unique(arr){
    var res=[];
    for(var i=0,len=arr.length;i<len;i++){
        var obj = arr[i];
        for(var j=0,jlen = res.length;j<jlen;j++){
            if(res[j]===obj) break;            
        }
        if(jlen===j)res.push(obj);
    }
    return res;
}
var arr=[1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
var ary = unique(arr);
console.log(ary)//[1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0, "a", {…}, {…}] length:14

4、基础写法2(不能过滤NaN和{})

function unique(arr){
    for(var i=0;i<arr.length;i++){
        for(var j=i+1;j<arr.length;j++){
            if(arr[i]==arr[j]){
              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',{},{}];
var ary = unique(arr);
console.log(ary)//[1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0, "a", {…}, {…}] length:14

5、利用{}的key唯一性 (能过滤{},但不能区分“NaN”和NaN)

function unique(arr) {
  var obj= {};
  return arr.filter(function(elem) {
    return obj.hasOwnProperty(elem) ? false : (obj[elem] = true);//
  });
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
var ary= unique(arr);
console.log(ary); //[1, "true", 15, false, undefined, null, NaN, 0, "a", {…}]  length:10

6、利用map的key唯一性 (不能去掉重复的{})

function unique(arr){
  let ary=[]
  let map=new Map()
  for(let i=0;i<arr.length;i++){
    if(!map.get(arr[i])){
      map.set(arr[i],1)
      ary.push(arr[i])
    }
  }
  return ary
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
var ary= unique(arr);
console.log(ary); //[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]   length:13

7、利用reduce和includes (不能去掉重复的{})

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", {}, {}]   length:13
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 方法一 For嵌套for 使用splice去重更改原数组 正向遍历循环 遇到删掉 原数组递减1 { let a...
    金色888阅读 420评论 0 0
  • 数组去重,一般都是在面试的时候才会碰到,一般是要求手写数组去重方法的代码。如果是被提问到,数组去重的方法有哪些?你...
    程序员BUG阅读 787评论 0 3
  • JS数组去重是前端面试,常考察的一道题,你会几种方法呢?如果你有更好的方法,可以在文章下放评论区提供。接下来看看8...
    尤小小阅读 18,559评论 9 13
  • 前言 本文2895字,阅读大约需要12分钟。 总括: 本文总结了10种常见的数组去重方法,并将各种方法进行了对比...
    秦至阅读 560评论 0 2
  • 关注 如何答一道惊艳面试官的数组去重问题? 为什么写这篇文章? 数组去重应该是面试必考问题之一。 虽然它是一道并不...
    冇得感情阅读 256评论 0 1