根据我自己的总结归纳,数组去重分为两种类型的方法,一种是在原来的的数据里面删除重复的元素,另一种是把原数组里面相同的元素添加到一个新数组里面。不管是什么方法都是利用这种解决思路去设计的。
var numArr = [1,1,1,2,2,2,2,2,2,3,3,3,4,5,6,5,6];
var strArr = ['a','a','a','b','b','c','cc']
function norepeat(arr) {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] == arr[j]) {
arr.splice(j, 1); //删除从j开始的1个元素,
j--;//数组下标回退
}
}
}
return arr;
}
var newNumArr = norepeat(numArr);
var newStrArr = norepeat(strArr);
console.log(newNumArr,newStrArr);
//[ 1, 2, 3, 4, 5, 6 ] [ 'a', 'b', 'c', 'cc' ]
var numArr = [1,1,1,2,2,2,2,2,2,3,3,3,4,5,6,5,6];
var strArr = ['a','a','a','b','b','c','cc']
function norepeat(arr) {
for (let i = 0; i < arr.length; i++) {
if (arr.indexOf(arr[i]) != i) { //如果arr[i]的下标 与 i不相等说明 arr[i]与arr[i-1]相同 代表arr[i]与arr[i-1]重复出现
arr.splice(i,1);//删除数组第i个元素
i--;//数组下标回退
}
}
return arr;
}
var newNumArr = norepeat(numArr);
var newStrArr = norepeat(strArr);
console.log(newNumArr,newStrArr);
var numArr = [1,1,1,2,2,2,2,2,2,3,3,3,4,5,6,5,6];
var strArr = ['a','a','a','b','b','c','cc']
function norepeat(arr){
var arr1=[];
var end; //临时变量用于对比重复元素
arr.sort(); //对数组的元素进行排序
end=arr[0]; //arr的第一个元素值赋值给end 用于第一次判断
arr1.push(arr[0]); //由于判断的条件是不相等时添加新元素,所以需要把第一个元素先添加到新数组里面
for(let i=0;i<arr.length;i++){
if(arr[i] !=end){ //当前元素如果和临时元素不相等时将此元素添加到新数组中
arr1.push(arr[i])
end=arr[i]
}
}
return arr1;
}
var newNumArr = norepeat(numArr);
var newStrArr = norepeat(strArr);
console.log(newNumArr,newStrArr);
var numArr = [1,1,1,2,2,2,2,2,2,3,3,3,4,5,6,5,6];
var strArr = ['a','a','a','b','b','c','cc']
function norepeat(arr){
var arr1 =[]; //创建一个新数组
for(let i=0;i<arr.length;i++){
if(arr1.indexOf(arr[i]) == -1){ // 如果arr1使用indexOf方法得到的当前元素的位置为-1 则说明该元素不存在arr1里面
arr1.push(arr[i]); //把当前元素添加进新数组里面
}
}
return arr1;
}
var newNumArr = norepeat(numArr);
var newStrArr = norepeat(strArr);
console.log(newNumArr,newStrArr);
filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
注意: filter() 不会对空数组进行检测。
注意: filter() 不会改变原始数组。
参数 --------------------描述
currentValue----------必须。当前元素的值
index-------------------可选。当前元素的索引值
arr-----------------------可选。当前元素属于的数组对象
var numArr = [1,1,1,2,2,2,2,2,2,3,3,3,4,5,6,5,6];
var strArr = ['a','a','a','b','b','c','cc']
var newNumArr =numArr.filter(function(currentValue,index,arr){
if (arr.indexOf(currentValue) ===index){
return currentValue //返回值为 下标值与数组索引值相同的元素
}
});
var newStrArr =strArr.filter(function(currentValue,index,arr){
return arr.indexOf(currentValue) ===index;
});
console.log(newNumArr,newStrArr)
/* Set对象是值的集合,你可以按照插入的顺序迭代它的元素。
Set中的元素只会出现一次,即 Set 中的元素是唯一的。*/
var numArr = [1,1,1,2,2,2,2,2,2,3,3,3,4,5,6,5,6];
var strArr = ['a','a','a','b','b','c','cc']
function norepeat(arr) {
return Array.from(new Set(arr))
}
var newNumArr = norepeat(numArr);
var newStrArr = norepeat(strArr);
console.log(newNumArr,newStrArr);
第二种
const arr = [1, 1, 5, 5, 6, 98, 9];
const uniqueArr= [...new Set(arr)];
//has判断Map实列中是否有这个键值,返回boolean值
// 把数组的每一个元素作为key存到Map中。由于Map中不会出现相同的key值,所以最终得到的就是去重后的结果。
var numArr = [1,1,1,2,2,2,2,2,2,3,3,3,4,5,6,5,6];
var strArr = ['a','a','a','b','b','c','cc']
function norepeat(arr) {
let map = new Map();
let arr1 = [] //创建一个新数组
for (let i = 0; i < arr.length; i++) {
if (map.has(arr[i])) { //如果arr[i]这个键已经存在
map.set(arr[i], true); //设置map键值对 重复出现的元素 键值为true
}
else {
map.set(arr[i], false);
arr1.push(arr[i]);
}
}
console.log(map); //map里面重复键值为true代表 键值为true的键对应的元素是重复的
return arr1;
}
var newNumArr = norepeat(numArr);
var newStrArr = norepeat(strArr);
console.log(newNumArr,newStrArr);
以上就是我总结归纳的数组去重的几种常用的方法,万变不离其宗数组去重的根本思想就是在原有数组上进行删除或者创建新的数组添加不同的元素到新数组当中。
如果大家有更好的方法请留言或者评论,我会及时更正。谢谢大家。