javascript算法集:数组去重

数组去重 方法一(ES6的Set数据结构)

1
2
3
4
5
6
7
8
/*
* 数组去重
* @param {array} ary 需要去重的数组
* @return {array} 去重后的数组
*/
function unique1(ary){
return [...new Set(ary)];
}

数组去重 方法二(对象的key唯一性)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
* 数组去重
* @param {array} ary 需要去重的数组
* @return {array} 去重后的数组
*/
function unique2(ary){
let obj = {},
i = 0,
len = ary.length;
while(i < len){
if(!obj[ary[i]]){
obj[ary[i]] = true; // 如果不存在
}
i++;
}
return Object.keys(obj);
}

PS:该方法存在一定问题,数组的元素全部被转化为字符串,因为ES6之前对象的key只能是字符串。
会把数字1和字符串’1’,会被视为同一个值。

数组去重 方法三(临时数组判断插入)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
* 数组去重
* @param {array} ary 需要去重的数组
* @return {array} 去重后的数组
*/
function unique3(ary){
let tem = [],
i = 0,
len = ary.length;
while(i < len){
// tem.indexOf() === -1 同理
!tem.includes(ary[i]) ? tem.push(ary[i]) : '';
i++;
}
return tem;
}

数组去重 方法四(判断首次出现的位置)

如果当前数组的第i项在当前数组中第一次出现的位置不是i,那么表示第i项是重复的,忽略掉。否则存入结果数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
* 数组去重
* @param {array} ary 需要去重的数组
* @return {array} 去重后的数组
*/
function unique4(ary){
let tem = [ary[0]],
len = ary.length;
for(let i = 1; i < len; i++ ){
// 核心,首次的索引出现是否为当前的索引
if(ary.indexOf(ary[i]) === i) tem.push(ary[i]);
}
return tem;
}

数组去重 方法五(排序后逐个比较插入)

给传入数组排序,排序后相同值相邻,然后遍历时新数组只加入不与前一值重复的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*
* 数组去重
* @param {array} array 需要去重的数组
* @return {array} 去重后的数组
*/
function unique5(array){
let ary = array.slice();
ary.sort();
let tem = [ary[0]];
for(let i = 0, len = ary.length; i < len; i++){
ary[i] !== tem[tem.length - 1] ? tem.push(ary[i]) : '';
}
return tem;
}

PS:返回的数组顺序发生了改变。

数组去重 方法六()

获取没有重复的最右一值放入新数组(检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
* 数组去重
* @param {array} ary 需要去重的数组
* @return {array} 去重后的数组
*/
function unique6(ary){
let tem = [];
for(let i = 0, len = ary.length; i < len; i++){
for(let j = i + 1; j < len; j++){
if(ary[i] === ary[j]) j = ++i;
}
tem.push(ary[i])
}
return tem;
}

测试:unique1([1, 2, 3, 2]) // [1, 2, 3]

THE END