目录
1、排序法
思路:
- 先将数组进行排序
- 再利用for循环遍历,如果当前数和下一个数不一样,将当前数添加进新数组
// 排序法
var arr = [1, 2, 1, 2, 3, 1];
arr.sort((a, b) => a - b);
let res = [];
for (let i = 0; i < arr.length; i++){
if (arr[i] != arr[i + 1]) {
res.push(arr[i])
}
}
console.log(res);
2、indexOf 遍历数组法
思路:
- 创建一个新的空数组,用来存放去重后的新数组.
- 利用for循环循环遍历需要去重的数组.
- 利用
indexOf()
方法查询遍历出的数组在新数组中是否出现,如果出现:则继续遍历数组,如未出现:则利用push方法添加到新数组中. - 原数组循环遍历完成后,组建一个已经去除重复的新数组.
var arr1 = [1, 2, 1, 2, 3, 1];
function unique(arr) {
var res = [];
for (let i = 0; i < arr.length; i++){
if (res.indexOf(arr[i]) === -1) {
res.push(arr[i])
}
}
return res;
}
console.log(unique(arr1));
3、indexOf 数组下标法
调用indexOf方法,性能和方法indexOf遍历数组法差不多
思路:
- 创建一个新的空数组,用来存放去重后的新数组.
- 利用for循环循环遍历需要去重的数组.
- 如果当前数组的第 i 项在当前数组中第一次出现的位置不是 i,那么表示第 i 项是重复的,忽略掉。否则存入结果数组。
// 数组下标法
var arr1 = [1, 2, 1, 2, 3, 1];
function unique(arr) {
let res = [];
for (let i = 0; i < arr.length; i++){
if (arr.indexOf(arr[i]) == i) {
res.push(arr[i])
}
}
return res;
}
console.log(unique(arr1));
4、循环判断法
思路:
- 通过两重循环,内部循环判断是否相等,如果相等将外层循环的循环变量+1
- 这样减少了循环的次数,之后当内部循环结束一次之后arr[i]则为第一个与前一个元素不相等的值。然后赋值给一个新的数组。
//循环判断法
let arr = [1, 2, 1, 2, 3, 1];
function unique(arr1) {
var res = [];
for (let i = 0; i < arr1.length; i++) {
for (let j = i + 1; j < arr1.length; j++) {
if (arr1[i] == arr1[j]) {
i++;
}
}
res.push(arr1[i]);
}
return res;
}
console.log(unique(arr));
5、set 去重
思路:
- ES6提供了新的数据结构Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
- Set函数可以接受一个数组(或类似数组的对象)作为参数,用来初始化。
let arr = [1, 2, 1, 2, 3, 1];
var s = new Set(arr);
console.log([...s]);
6、map去重
思路:
- 创建一个空
Map
,遍历原始数组 - 把数组的每一个元素作为
key
存到Map中,因为Map
中不会出现相同的key
值,所以最终得到Map
中的所有key
值就是去重后的结果。
// map 实现数组去重
let arr1 = [1, 2, 1, 2, 3, 1];
function unique(arr) {
let res = [];
let map = new Map();
for (let i = 0; i < arr.length; i++){
if (map.has(arr[i])) {
map.set(arr[i],true) // true代表该key值在原始数组中重复了
}
else {
map.set(arr[i], false); // false 代表该key值在原数组中不重复
res.push(arr[i]);
}
}
return res;
}
console.log(unique(arr1));