大前提:创建一个随机数组,在此基础上实现数组去重
function creatArr(length, min, max) {
let arr = [];
for (let i = 0; i < length; i++) {
arr.push(~~(Math.random() * (max - min + 1) + min));
}
return arr;
}
一:运用splice方法实现:数组去重(tip:直接修改原数组)
- splice():删除和增加数组元素
- arr.splice(开始下标,删除的个数,新增元素1,新增元素2)
let arr1 = creatArr(8, 1, 10);
console.log(arr1);
let uniq = (arr) => {
//拿到首个数组
for (let i = 0; i < arr.length; i++) {
//将首个数组之后的数组元素与之前的对比 如果有相同的则删除 没有则保留进入新数组
for (let j = i + 1; j < arr.length; j++) {
//判断
if (arr[i] === arr[j]) {
arr.splice(j, 1); //以j为下标的数组元素开始,删除一个数组元素
//只有j++会漏判一位 解决这个问题就用j-- 减一个加一个下标不变 不会漏判,删除后所有数组元素下标往前移动一位
j--;
}
}
}
return arr;
};
console.log(uniq(arr1));
二: 运用indexOf方法实现:数组去重(tip:新建空数组,返回新数组)
- indexOf()方法是从前往后查找数组元素,返回第一个符合条件的下标,如果找不到,返回-1
- arr.indexOf(数组元素,index)
难点:进入循环的条件:
//在新数组中添加元素 要求元素不重复
//如果元素重复不要进入循环 而进入循环的条件是元素不重复即在查找数组元素时,没有返回符合条件数组元素,就是要结果返回-1,因此返回-1的数组满足条件
let arr2 = creatArr(10, 1, 10);
console.log(arr2);
let noReapt = (arr) => {
let newArr = [];
//遍历数组元素
for (let i = 0; i < arr.length; i++) {
//indexOf()方法是从前往后查找数组元素,返回第一个符合条件的下标,如果找不到,返回-1
//在新数组中添加元素 要求元素不重复
//如果元素重复不要进入循环 而进入循环的条件是元素不重复即在查找数组元素时,没有返回符合条件数组元素,就是要结果返回-1,因此返回-1的数组满足条件
if (newArr.indexOf(arr[i]) === -1) {
newArr.push(arr[i]);
}
}
return newArr;
};
console.log(noReapt(arr2));
三:运用includes方法实现数组去重
- includes() 方法用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false
let arr3=creatArr(8,1,10)
console.log(arr3);
let onlyOne =(arr)=>{
let newArr2=[]
for (let i = 0; i < arr.length; i++) {
//判读该数组是否包含某个数
if (!newArr2.includes(arr[i])) {//新数组不包含就数组的某个数 也就是说新数组没有原数元素,则可以添加到新数组中(不重复),返回false ;如果包含原数组的元素了,就不能添加到组中去
newArr2.push(arr[i]);
}
}
return newArr2;
}
console.log(onlyOne(arr3));
结果呈现如下:
四:运用sort方法实现数组去重
核心思路:
1.给原数组排序
2.比较原数组的第i项和第i+1项是否相等
3.如果不相等添加到新数组中
4.返回新数组
function qc4(arr) {
let newArr = [];
arr = arr.sort((a, b) => a - b);
for (let i = 0; i < arr.length; i++) {
if (arr[i] !== arr[i + 1]) {
newArr.push(arr[i]);
}
}
return newArr;
}
let arr4 = [4, 14, 144, 2, 12, 14, 10, 1, 3, 14, 2, 3];
console.log(qc4(arr4)); //(8) [1, 2, 3, 4, 10, 12, 14, 144]
五:运用对象的唯一key属性
核心思路:
1.新建空对象和空数组
2.遍历数组
3.判断新对象是否包含某个属性
4.如果包含什么也不做
5.如果不包含 给对象设置属性 利用key具有唯一性,把新对象的所有数组,作为数组元素
6.返回新数组
function qc5(arr) {
let newArr = [];
let newObj = {};
for (let i = 0; i < arr.length; i++) {
//判断对象是否包含某个属性
if (!newObj.hasOwnProperty(arr[i])) {
//不包含 给对象设置属性
newObj[arr[i]] = "1";
//把对象唯一的属性作为数组元素
newArr.push(arr[i]);
}
}
return newArr;
}
let arr5 = [1, 2, 3, 45, 12, 13, 12, 5, 12, 3, 5, 8];
console.log(qc5(arr5)); //(8) [1, 2, 3, 45, 12, 13, 5, 8]
六、利用ES6新增-Set结构
ES6新增的数据结构,类似数组,但是成员没有重复的值,只有唯一性Set是内置的构造函数
语法:let s = new Set ( 数组 | 类数组 )
应用于数组去重:
//set
let arr6 = [1,2,3,1,2,3,4,5,6,5,7]
let s1=new Set(arr6);
console.log(s1);
//对象的扩展运算符(...)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中
//转换成数组
console.log([...s1]);//(7) [1, 2, 3, 4, 5, 6, 7]