「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战」
数组去重
是为了面试,需要掌握更多的方法
课上会介绍5种方法,最少要掌握2种以上
方法1: indexOf()+forEach
建立一个新的数组,将原始数组的数值,写入到新数组中
如果新数组中没有这个数值的存在,再写入
indexOf() 判断 结果 是 -1
方法2: 双重for循环+splice
外层从第一个数值循环至最后一个数值
内层是从外层循环数值的下一个数值开始,循环至最后一个数值
比较外层循环的数值和内层循环的数值
如果数值相同,就是删除内层循环表示的数组单元
要做 内层循环遍历--操作,防止数组坍塌造成的影响
方法3: 一层for循环+sort+splice
将数组进行排序,让相同的数据都相邻
相邻的两个数值比较,如果数值相同,就删除后面的单元
要做 循环变量--操作,防止数组坍塌造成的影响
方法4: 利用对象的特性+forEach+for...in
相同属性名,只能建立一个对象单元
重复的属性名是做单元更新操作,而不是新建单元操作
数组的数据 --- 对象的属性名 --- 数组的数据
一.forEach+indexOf
将原始数组中的数据,写入到新的数组中
如果新数组中,没有这个数据,我们再进行写入操作
indexOf() 结果是 -1
var arr = [1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6];
var arr2 = setNewArr(arr);
console.log(arr2);
参数是需要执行去除重复数据的数组
function setNewArr(arr){
var newArr = [];
arr.forEach(function(val){
if( newArr.indexOf(val) == -1 ){
newArr.push(val);
}
})
return newArr;
}
二.for套for+splice
使用双层for循环,来完成对数组中数值的比较
如果数值相同,就删除其中一个数值
从第一个数值开始循环,第一个数值和其后的所有数据进行比较
如果要是数值相同,就删除之后的数值
循环次数比较多
var arr123 = [1,2,3,4,5,1,2,3,4,5,1,2,3,4,5];
function setNewArr2(arr){
// 外层循环,从第一个数值开始,循环至最后一个数值
for(var i = 0 ; i <= arr.length-1 ; i++){
// 内层循环,从当前起始数值的下一个数值开始,循环至最后一个数值
for(var j = i+1 ; j <= arr.length-1 ; j++){
if(arr[i] === arr[j]){
// 执行删除数组单元操作,之后的单元,会前移,顶替当前位置的单元
// 此时,当前位置就是放置了一个新的单元
// 这个位置就必须要重新操作一次,判断数值是否相同
arr.splice(j,1);
// 先将循环生成的索引--, 在执行循环的++
// 等于操作之后,索引值没有变,下次循环,执行的对象,仍然是当前这个单元
j--;
}
}
}
return arr;
}
var newArr = setNewArr2(arr123);
console.log(newArr);
总结:
循环操作数组,只要执行了删除数组单元的操作
一定要将循环变量数值 执行 -- 操作
三.for+sort+splice
先将数组中的数值,按照大小顺序,排列
排序之后,相同的数值,一定是相邻的
此时,只要相邻的两个数值比较,如果相同,删除后一个数据,再执行 i--
使用一层循环就可以了
循环次数就比较少
var arr = [1,2,3,4,5,1,2,3,4,5,1,2,3,4,5];
var newArr = setNewArr3(arr);
console.log(newArr);
function setNewArr3(arr){
// 先对数组进行排序操作,相同数据,相邻
var newArr = arr.sort(function(a,b){return a-b});
console.log(newArr);
// 当前数据与下一个数据比较
// 冒泡排序的优化原理:只要循环到倒数第二个单元
// 就会通过i+1 与最后一个单元比较
// 比较到最后一个单元,循环只要执行到,倒数第二个单元
for(var i = 0 ; i <= newArr.length-1 -1 ; i++){
if(newArr[i] === newArr[i+1]){
// 删除后一个单元
newArr.splice(i+1 , 1);
// 防止数组坍塌,造成有单元没有执行操作
i--;
}
}
return newArr;
}
四.利用对象的特性+forEach+for...in
获取字符串,中字符出现的次数
获取数组中,数据出现的次数
与数组去重的方式4,是有一定的联系的
数组去重方式4:利用对象的属性来去重
var arr = [1,2,3,4,1,2,3,4,5,1,2,3,4,5,6,];
var obj = {};
var newArr = [];
arr.forEach(function(v){
// 将数组的数值,作为对象的属性/键名
// 给对象,新增单元,如果已经有了,就是再次赋值,不会再次新增
obj[v] = '随便写';
})
这个对象中,属性是数组的数值
只要让属性值,是数组数值的出现的次数就可以了
console.log(obj);
for(var attr in obj){
// 将对象的属性/键名,作为数据,写入到数组中
newArr.push(attr);
}
console.log(newArr);