在你学习JavaScript或者面试或者工作中,不难免会遇到数组去重问题,下面就是我整理出数组去重的几种方法,希望对小伙伴们有帮助(??(●‘?‘●))
1.借助indexOf()方法判断此元素在该数组中首次出现的位置下标与循环的下标是否相等
1 var arr = [1,23,1,1,1,3,23,5,6,7,9,9,8,5,5,5]; 2 console.log(arr); //[1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5, 5, 5] 3 function noRepeat2(arr) { 4 for (var i = 0; i < arr.length; i++) { 5 if (arr.indexOf(arr[i]) != i) { 6 arr.splice(i,1);//删除数组元素后数组长度减1后面的元素前移 7 i--;//数组下标回退 8 } 9 } 10 return arr; 11 } 12 var newArr = noRepeat2(arr); 13 console.log(newArr); //[1, 23, 3, 5, 6, 7, 9, 8]
2.将数组的每一个元素依次与其他元素做比较,发现重复元素,删除
1 var arr = [1,23,1,1,1,3,23,5,6,7,9,9,8,5,5,5,5]; 2 console.log(arr); //[1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5, 5, 5, 5] 3 function noRepeat1(arr) { 4 for(var i = 0; i < arr.length-1; i++){ 5 for(var j = i+1; j < arr.length; j++){ 6 //判断是否相等,如果相等就删除 7 if(arr[i]===arr[j]){ 8 arr.splice(j,1); 9 j--; 10 } 11 } 12 } 13 return arr; 14 } 15 var arr2 = noRepeat1(arr); 16 console.log(arr2); //[1, 23, 3, 5, 6, 7, 9, 8]
3.借助新数组 通过indexOf方判断当前元素在数组中的索引如果与循环的下标相等则添加到新数组中
1 var arr = [1,23,1,1,1,3,23,5,6,7,9,9,8,5,5,5]; 2 console.log(arr) //[1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5, 5, 5] 3 function noRepeat4(arr) { 4 var ret = []; 5 for (var i = 0; i < arr.length; i++) { 6 if (arr.indexOf(arr[i]) == i) { 7 ret.push(arr[i]); 8 } 9 } 10 return ret; 11 } 12 var arr2 = noRepeat4(arr); 13 console.log(arr2); //[1, 23, 3, 5, 6, 7, 9, 8]
4.利用数组中的filter方法
1 var arr = [‘apple‘,‘banana‘,‘pear‘,‘apple‘,‘orange‘,‘orange‘]; 2 console.log(arr) //["apple", "banana", "pear", "apple", "orange", "orange"] 3 var newArr = arr.filter(function(value,index,self){ 4 return self.indexOf(value) === index; 5 }); 6 console.log(newArr); //["apple", "banana", "pear", "orange"]
5.借助新数组,判断新数组中是否存在该元素如果不存在则将此元素添加到新数组中
1 var arr = [1,23,1,1,1,3,23,5,6,7,9,9,8,5]; 2 console.log(arr); //[1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5] 3 function noRepeat6(arr){ 4 var newArr = []; 5 for(var i = 0; i < arr.length; i++){ 6 if(newArr.indexOf(arr[i]) == -1){ 7 newArr.push(arr[i]); 8 } 9 } 10 return newArr; 11 } 12 var arr2 = noRepeat6(arr); 13 console.log(arr2); //[1, 23, 3, 5, 6, 7, 9, 8]
6.利用空对象来记录新数组中已经存储过的元素
1 var arr = [1,23,1,1,1,3,23,5,6,7,9,9,8,5]; 2 console.log(arr) //[1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5] 3 var obj={}; 4 var newArr=[]; 5 for(var i=0;i<arr.length;i++){ 6 if(!obj[arr[i]]){ 7 obj[arr[i]]=true; 8 newArr.push(arr[i]); 9 } 10 } 11 console.log(newArr); //[1, 23, 3, 5, 6, 7, 9, 8]
7.此方法没有借助新数组直接改变原数组,并且去重后的数组被排序
1 var arr = [1,23,1,1,1,3,23,5,6,7,9,9,8,5]; 2 console.log(arr); //[1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5] 3 function noRepeat8(arr) { 4 var end;//临时变量用于对比重复元素 5 arr.sort();//将数重新组排序 6 end = arr[0]; 7 for (var i = 1; i < arr.length; i++) { 8 if (arr[i] == end) {//当前元素如果和临时元素相等则将此元素从数组中删除 9 arr.splice(i,1); 10 i--; 11 }else{ 12 end = arr[i]; 13 } 14 } 15 return arr; 16 } 17 var arr2 = noRepeat8(arr); 18 console.log(arr2); //[1, 23, 3, 5, 6, 7, 8, 9]
8.借助新数组,判断新数组中是否存在该元素如果不存在则将此元素添加到新数组中(原数组长度不变但被按字符串顺序排序)
1 var arr = [1,23,1,1,1,3,23,5,6,7,9,9,8,5]; 2 console.log(arr); //[1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5] 3 function noRepeat7(arr) { 4 var ret = [], 5 end;//临时变量用于对比重复元素 6 arr.sort();//将数重新组排序 7 end = arr[0]; 8 ret.push(arr[0]); 9 for (var i = 1; i < arr.length; i++) { 10 if (arr[i] != end) {//当前元素如果和临时元素不等则将此元素添加到新数组中 11 ret.push(arr[i]); 12 end = arr[i]; 13 } 14 } 15 return ret; 16 } 17 var arr2 = noRepeat7(arr); 18 console.log(arr2); //[1, 23, 3, 5, 6, 7, 8, 9]
9.借助新数组
1 var arr = [1,1,2,2,3,3,4,4,5,5,4,3,2,1,1,1]; 2 console.log(arr); //[1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 4, 3, 2, 1, 1, 1] 3 var newArr = []; 4 for (var i = 0; i < arr.length; i++) { 5 var repArr = [];//接收重复数据后面的下标 6 //内层循环找出有重复数据的下标 7 for (var j = i + 1; j < arr.length; j++) { 8 if (arr[i] == arr[j]) { 9 repArr.push(j);//找出后面重复数据的下标 10 } 11 } 12 //console.log(repArr); 13 if (repArr.length == 0) {//若重复数组没有值说明其不是重复数据 14 newArr.push(arr[i]); 15 } 16 } 17 console.log(newArr); //[5, 4, 3, 2, 1]
10.借助ES6提供的Set结构
1 var arr = [1,1,2,2,3,3,4,4,5,5,4,3,2,1,1,1]; 2 console.log(arr); //[1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 4, 3, 2, 1, 1, 1] 3 function noRepeat11(arr){ 4 var newArr = []; 5 var myset = new Set(arr);//利用了Set结构不能接收重复数据的特点 6 for(var val of myset){ 7 newArr.push(val) 8 } 9 return newArr; 10 } 11 var arr2 = noRepeat11(arr) 12 console.log(arr2); //[1, 2, 3, 4, 5]
11.双层循环改变原数组
1 var arr = [1,1,2,2,3,3,4,4,5,5,4,3,1,2,6,6,6,6]; 2 console.log(arr); //[1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 4, 3, 1, 2, 6, 6, 6, 6] 3 function noRepeat9(arr){ 4 for (var i = 0; i < arr.length; i++) { 5 for (var j = 0; j < arr.length; j++) { 6 if (arr[i] == arr[j] && i != j) {//将后面重复的数删掉 7 arr.splice(j, 1); 8 } 9 } 10 } 11 return arr; 12 } 13 var arr2 = noRepeat9(arr); 14 console.log(arr2); //[1, 2, 3, 4, 5, 6]
有问题欢迎留言指出哦,或者小伙伴有更多方法,也欢迎在留言区留言哦!
原文:https://www.cnblogs.com/Mings-blog/p/12839568.html