1. for 循环嵌套
- 简单 for 嵌套,把每个元素都和后边的元素对比一下,如果重复,用 arr.splice()删除即可
-
//会改变原数组,所以用for更优 var arr = [1, 3, 2, 5, 2, 4, 1, 3, 4, 6]; for (var i = 0; i < arr.length; i++) { for (var j = i + 1; j < arr.length; ) { if (arr[i] === arr[j]) { arr.splice(j, 1); continue; } j++; } } console.log(arr); //或者使用占位原理,当然这样也会改变原数组,在这里看着其实比上边更加繁琐,但是可以提供一个防止数组塌陷的新思路,在其他地方(比如求被几和几整除的数)可以用到 var cut = "#"; 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); arr.splice(j, 0, cut); } } } var i; while ((i = arr.indexOf(cut)) !== -1) { if (arr[i] === cut) { arr.splice(i, 1); } }
2.布尔值判断
- 建立一个新数组 arr1,当 bool 为 false 时即新数组中没有这个元素时,用 push 将此元素添加到新数组 arr1 中,判断如果 bool 为 true 时即新数组 arr1 有这个元素时,所以不执行 arr1.push()
var arr = [1, 3, 2, 5, 2, 4, 1, 3, 4, 6];
//用布尔值判断,不改变原数组,所以原数组用for遍历和forEach遍历皆可
var arr1 = [];
for (var i = 0; i < arr.length; i++) {
var bool = false;
for (var j = 0; j < arr1.length; j++) {
if (arr1[j] === arr[i]) {
bool = true;
break;
}
}
if (!bool) arr1.push(arr[i]);
}
console.log(arr1);
//原函数用forEach遍历;
var arr1 = [];
arr.forEach((i) => {
var bool = false;
for (var j = 0; j < arr1.length; j++) {
if (arr1[j] === arr[i]) {
bool = true;
break;
}
}
if (!bool) arr1.push(arr[i]);
});
console.log(arr1);
3. 用 indexOf 去重
- arr.indexOf(元素,从下标第几位开始向后查找)查找元素所对应的下标,如果找到了就返回找到第一个下标,如果没有找到返回-1
- 与布尔值方法相同,当新数组没有找到此元素,即下标为-1 (arr[i] < 0) 时,用 push 将此元素添加到新数组 arr1 中
//不改变原数组
var arr = [1, 3, 2, 5, 2, 4, 1, 3, 4, 6];
var arr1 = [];
for (let i = 0; i < arr.length; i++) {
if (arr1.indexOf(arr[i] < 0)) {
arr1.push(arr[i]);
}
}
console.log(arr1);
4. 用 includes 去重
- arr.includes(元素);判断当前数组中是否有这个元素,如果有返回 true,否则返回 false
- 原理与布尔值方法和 indexOf 方法相同,当新数组没有找到此元素即 includes 返回 false 时,作取反后为 true,达成条件用 push 将此元素添加到新数组 arr1 中
- includesAPI ES6 存在,可能存在兼容性问题
var arr = [1, 3, 2, 5, 2, 4, 1, 3, 4, 6];
var arr1 = [];
for (var i = 0; i < arr.length; i++) {
if (!arr1.includes(arr[i])) {
arr1.push(arr[i]);
}
}
console.log(arr1);
5. 套用 reduce 去重
- reduce 函数有四个值分别是 Accumulator (acc) (累计器),Current Value (cur) (当前值),Current Index (idx) (当前索引),Source Array (src) (源数组)
- 回调函数第一次执行时,accumulator 和 currentValue 的取值有两种情况:如果调用 reduce()时提供了 initialValue 初始值,accumulator 取值为 initialValue,currentValue 取数组中的第一个值;如果没有提供 initialValue,那么 accumulator 取数组中的第一个值,currentValue 取数组中的第二个值。 - 如果给了初始值,value 返回的是 return 给的值,value 的从初始值开始,item 会从第一个元素开始 - 详细查看https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
- 这里 reduce 给出的初始值 initialValue 是[],所以 reduce 函数的返回值分配给累计器 acc,即新数组中没有此值,将返回此值给累计器 acc,执行条件与 indexOf 方法原理一样,逐步形成一个没有重复值的新数组
var arr = [1, 2, 2, 3, 4, 4, 5, 6, 5, 6, 7, 8, 9];
var arr1 = arr.reduce(function (acc, cur) {
if (acc.indexOf(item) < 0) acc.push(cur);
return acc;
}, []);
console.log(arr1);
6. 先排序,再判断是否是满足需求的值(不重复)满足i进位把值传给i
(是采用了某位大神zhen12321的盲人摸硬币法)
arr.sort(function (a, b) {
return a - b;
});
var i;
for (i = 0, j = 1; j < arr.length; j++) {
if (arr[j] !== arr[j - 1]) {
arr[++i] = arr[j];
}
}
arr.length = i + 1;
7.这个用的是方法去重,没错!是利用set的不重复性来转换一下
var arr=[1,4,2,1,2,3,2,1,1,2,3];
// var s=new Set(arr);
// console.log(Array.from(s))
arr=Array.from(new Set(arr));
console.log(arr)
8.(新更新)利用对象键名不重复性去重
var arr = [1, 3, 5, 2, 3, 4, 5, 6, 3, 4];
arr = Object.values(arr.reduce((v, t) => {
v["a"+t] = t;
return v
}, {}))
console.log(arr)