<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <h3>数组去重的方法</h3>
</body>
<script>
  var arr = [
    1,1,'1','1',true,true,'true','true',false,
    'false',undefined,undefined,'undefined','undefined',
    null,null,NaN,NaN,'NaN',0,0,'0',{},{},
  ];
// 第1//ES6 Set去重(ES6中最常用)
    //Array.from()方法就是将一个类数组对象或者可遍历对象转换成一个真正的数组。
    //所谓类数组对象,最基本的要求就是具有length属性的对象。
    //set(es6提供新数据结构,类似数组,但成员值都是唯一的)。
    //方法:添加成员返回set本身add(value),删除成员返回布尔值表示是否删除成功delete(value),返回布尔值判断是否为set成员has(value),清除所有成员无返回值clear()
    //注:set内部两个NaN相等,两个对象总是不相等的,去重不了{}对象
    // function unique1(arr) {
    //   return Array.from(new Set(arr))
    // }
    // console.log(unique1(arr));
// 第2for嵌套for
    // NaN和{}没有去重,null直接都消失了
    // function unique2(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;
    // }
    // console.log(unique2(arr));
// 第3indexOf
    //indexOf,如果检测结果没有匹配值返回-1,匹配到返回1
    //NaN 和{}没有去重
    // function unique3(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;
    // }
    // console.log(unique3(arr));
// 第4sort()排序方法
    //对排序结果遍历相邻元素对比
    //NaN 和{}没有去重
    // function unique4(arr) {
    //   if(!Array.isArray(arr)){
    //       console.log('type error');
    //       return
    //   }
    //   arr = arr.sort();
    //   var array = [arr[0]];
    //   for(var i=1;i<arr.length;i++){
    //     if(arr[i]!==arr[i-1]){
    //       array.push(arr[i])
    //     }
    //   }
    //   return array;
    // }
    // console.log(unique4(arr));
// 第5利用对象的属性不能相同的特点进行去重
    //两个true都去掉了,但其他都成功了
    // function unique5(arr) {
    //   if(!Array.isArray(arr)){
    //   console.log('type error');
    //   return
    //   }
    //   var array = [];
    //   var obj = {};
    //   for(var i=0;i<arr.length;i++){
    //     if(!obj[arr[i]]){
    //       array.push(arr[i]);
    //       obj[arr[i]] = 1;
    //     }else{
    //       obj[arr[i]]++;
    //     }
    //   }
    //   return array;
    // }
    // console.log(unique5(arr));
// 第6,includes检测数组是否有某个值返回布尔值(es6)
    //{}没有去重
    // function unique6(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])){
    //       arr.push(arr[i]);
    //     }
    //   }
    //   return array;
    // }
    // console.log(unique6(arr));
// 第7hasOwnProperty
    //hasOwnProperty判断对象是否存在属性
    //所有的都去重了
    function unique7(arr) {
      var obj = {};
      return arr.filter(function(item,index,arr){
        return obj.hasOwnProperty(typeof item + item)?false:(obj[typeof item + item] = true)
      })
    }
    console.log(unique7(arr));
// 第8利用filter
    //对象未去重,NaN都被去掉了
    // function unique8(arr){
    //   return arr.filter(function(item,index,arr){
    //     return arr.indexOf(item,0) === index;
    //   })
    // }
    // console.log(unique8(arr));
// 第9,递归去重
    //NaN和{}未去重
    // function unique9(arr) {
    //   var array = arr;
    //   var len = array.length;
    //   array.sort(function(a,b){
    //     return a+b;
    //   })
    //   function loop(index){
    //     if(index >=1){
    //       if(array[index] === array[index-1]){
    //         array.splice(index,1);
    //       }
    //       loop(index-1);
    //     }
    //   }
    //   loop(len-1);
    //   return array;
    // }
    // console.log(unique9(arr));
// 第10,Map数据结构去重
    //{}未去重
    // function unique10(arr) {
    //   let map = new Map();
    //   let array  =new Array();
    //   for(let i=0;i<arr.length;i++){
    //     if(map.has(arr[i])){
    //       map.set(arr[i],true);
    //     }else{
    //       map.set(arr[i],false);
    //       array.push(arr[i]);
    //     }
    //   }
    //   return array;
    // }
    // console.log(unique10(arr));
</script>
</html>