数组去重方法与是够改变原数组
数组方法是否改变原数组
这里只需要记住一句话即可,针对数组中增删改翻的方法都是会改变原数组,其它的则是返回新数组或者返回布尔值索引等
- 增加元素:push()添加到末尾,unshift()添加到开头
- 删除元素:shift()删除第一个,pop()删除最后一个
- splice比较特殊,既可以删除也可以添加。splice(2, 0, "hello", [6, 7, 8]);// 第一个参数表示从第2位开始;第二个参数表示删除0个;第三个参数开始为要添加的元素,可以是数组,可以只做删除操作,方便快捷
- sort(),reverse()翻转数组也会改变原数组
- slice是截取数组某一段,也是一个不改变原数组的方法
- 数组的其它方法附图
![]()
数组去重的方法(散发:相反可以获取重复的值)
这里先介绍简单快捷的方法
-
set与Array.from去重(利用set值不重复与数组原生转化方法)
Array.from(new Set(arr)) -
利用解构赋值与set
let arr1 = [...new Set(arr)] -
利用filter与indexOf去重
array.filter((item,index,arr)=>{ //indexOf的索引等于值本身的索引就返回 //0表示开始查找位置,默认也是0,可以省略 return arr.indexOf(item,0) === index; }) -
利用indexOf方法去重(for循环遍历,forEach/map均可实现,但for循环效率高)
for(var i=0;i<array.length;i++){ //不存在就返回-1,就将值添加进新数组 if(array1.indexOf(array[i]) === -1) { array1.push(array[i]); } return array1; } -
利用includes去重(原理和indexOf一致)
//includes()存在就返回true,不存在就返回false //在效率对比中,for>foreach>map>for..in,使用for更为妥当 for(var i=0;i<array.length;i++){ if(!array1.includes(array[i])){ array1.push(array[i]) return array1; }
较为复杂或者有缺陷的方法
-
利用for双循环以及splice()进行去重
//原理:先将数组遍历一遍,再将每一个值对数组再遍历一遍,相同就删除 for(var i=0,length=array.length;i<array.length;i++){ for(var j=0,length=array.length;j<array.length;j++){ if(array[i]===array[j]){ //如果后面有相同的值就删除 array.splice(j,1); j--; //删除一个数之后,j值-1 length--;//删除之后长度-1,减少循环次数,节省性能 } } } -
利用sort进行去重(存在局限性,了解即可)
function repeat( array ){ array = array.sort(); console.log(array); var array1 = [array[0]]; for(var i=1,leng=array.length;i<leng;i++){ if(array[i] !== array[i-1]){ array1.push(array[i]); } } return array1; } console.log(repeat(array)); -
利用对象属性不能相同进行去重(普通对象,Map对象)
-
利用Map属性值不一致进行去重,将数组值设置为Map属性
let map = new Map(); let array1 = []; for(let i=0;i<array.length;i++){ //通过对象方法has判断是否存在此属性key if(map.has(array[i])){ map.set(array[i],true); }else { //不存在就将值设置为false map.set(array[i],false); array1.push(array[i]); } //完成之后可以通过map了解哪几个重复 } -
利用对象属性不重复(存在缺陷,了解即可)
function repeat(array){ var array1 = []; var obj = {}; for(var i=0,leng=array.length;i<leng;i++){ if(!obj[array[i]]){ array1.push(array[i]); obj[array[i]] = 1; } else{ obj[array[i]]++; } } return array1; }
-
4.利用递归进行数组去重
//针对数字类型,先升序排序,如果相同那么肯定相邻
//index从数组最后开是进行比较,相邻相同就删除,并且次数-1,提高效率
var array1 = array;
var length = array1.length;
array1.sort((a,b)=>{
//小于0就排前面,升序
return a-b
})
//递归函数loop
function loop(index){
if(index>=1){
if(array1[index]===array1[index-1]){
array1.splice(index,1)
}
loop(index-1);
}
//进行递归
loop(length-1);
return array1;
}


浙公网安备 33010602011771号