# 题目描述
请补全JavaScript代码,要求去除数组参数中的重复数字项并返回该数组。 注意:
- 数组元素仅包含数字
# 用例
- 输入:
_deleteRepeat([-1,1,2,2])
- 输出:
[-1,1,2]
# 方法
- 利用
ES6
的set
和扩展运算符 set + Array.from
方法(可浅拷贝一个可迭代对象)- 声明一个空数组,用
includes
寻找如果没有该元素则加入新数组 - 利用
reduce
方法和includes
hasOwnProperty
方法可以判断类型两个{}
,{}
- 过滤器
filter
方法+indexof()
方法,indexof
会返回第一个找到的索引,如果当前数值之前出现过,则indexof
返回的索引恒为之前的那个数与当前数值的索引不一致,故可以去重 indexof
- 双循环+
splice
,比较相邻两个数如果重复用splice
删除 - 单循环+
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
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