# 题目描述

请补全JavaScript代码,要求去除数组参数中的重复数字项并返回该数组。 注意:

  1. 数组元素仅包含数字

# 用例

  • 输入: _deleteRepeat([-1,1,2,2])
  • 输出: [-1,1,2]

# 方法

  1. 利用ES6set和扩展运算符
  2. set + Array.from方法(可浅拷贝一个可迭代对象)
  3. 声明一个空数组,用includes寻找如果没有该元素则加入新数组
  4. 利用reduce方法和includes
  5. hasOwnProperty方法可以判断类型两个{},{}
  6. 过滤器filter方法+indexof()方法,indexof会返回第一个找到的索引,如果当前数值之前出现过,则indexof返回的索引恒为之前的那个数与当前数值的索引不一致,故可以去重
  7. indexof
  8. 双循环+splice,比较相邻两个数如果重复用splice删除
  9. 单循环+sort+splice

# 代码实现

//  1.set+点运算符
Array.prototype.unique = function(){
    let arr1 = [...new Set(arr)];
    return arr1;
}

// 2. set + Array.from方法(可浅拷贝一个可迭代对象)
Array.prototype.unique = function(){
    let arr1 = Array.from(new Set(arr));
    return arr1;
}

// 3. 声明一个空数组,用includes寻找如果没有该元素则加入新数组
  //         以下三种写法均归为一种思路
// 写法一:includes方法:[includes底层使用sameValueZero()比较]
   Array.prototype.unique = function(){

    const newArray = [];
    arr.forEach(item=>{
        if(!newArray.includes(item)){
            newArray.push(item);
        }
    })
    return newArray;
}
 
  //  写法二:利用map的has和set方法(属性名不可重复)
Array.prototype.unique = function(){
    const newArray = [];
    const map = new Map();
    arr.forEach(item=>{
        if(!map.has(item)){
            map.set(item,true);
            newArray.push(item);
        }
    })
    return newArray;
}

  //  写法三:利用对象属性名不可重复
Array.prototype.unique = function(){
    const newArray = [];
    const obj = {};
    arr.forEach(item=>{
        if(!obj[item]){
            obj[item] = true;
            newArray.push(item);
        }
    })
    return newArray;
}
4.利用reduce方法和includes
Array.prototype.unique = function(){
    const newArray = arr.reduce((pre,cur)=>{
        if(pre.includes(cur) === false){
            pre.push(cur);
        }
        return pre;
    },[])
    return newArray;
}

// 5.hasOwnProperty方法可以判断类型两个{},{}
Array.prototype.unique = function(){
    const obj = {};
    const newArray = arr.filter(item=>{
        return obj.hasOwnProperty(typeof item + item) ? false : obj[typeof item +item] = true
    })
       // typeof {}+{}为object[object Object],判断有没有空对象,已经有的话return false,没有就作为对象的属性加进去,值为true   
    return newArray;
}
console.log(arr.unique());

// 下列方法无法判断NaN和NaN重复的情况

// 6.过滤器filter方法+indexof()方法,indexof会返回第一个找到的索引,如果当前数值之前出现过,
      //    则indexof返回的索引恒为之前的那个数与当前数值的索引不一致,故可以去重
Array.prototype.unique = function(){
    const newArray = arr.filter((item,index)=>{
        return arr.indexOf(item)===index;
    })
    return newArray;
}

// 7.indexof
Array.prototype.unique = function(){
    const newArray = [];
    arr.forEach(item=>{
        if(newArray.indexOf(item)===-1){
            newArray.push(item);
        }
    })
    return newArray;
}

// 8.双循环+splice,比较相邻两个数如果重复用splice删除
Array.prototype.unique = function(){
    let len = arr.length;
    for(let i=0;i<len-1;i++){
        for(let j=i+1;j<len;j++){
            if(arr[i]===arr[j]){
                arr.splice(j,1);
                len--;
                j--;
            }
        }
    }
    return arr;
}
// 9.单循环+sort+splice
Array.prototype.unique = function(){
    let len = arr.length;
    arr = arr.sort();
    for(let i=0;i<len-1;i++){
            if(arr[i]===arr[i+1]){
                arr.splice(i+1,1);
                len--;
            }
    }
    return arr;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121