数组去重后返回的新数组有两种创建方式:一种是新建一个空数组,将原数组的不重复元素依次放进去,依赖于数组的push();另一种是在原数组的基础上,删除重复元素,依赖于数组的splice()。这两种方式在以下方法中都是可行的。
- 遍历+includes()
function unique(arr){ var newArr = []; var len = arr.length; for(var i=0;i<len;i++){ if(!newArr.includes(arr[i])){ newArr.push(arr[i]); } } return newArr; }
- 遍历+filter()
function unique(arr){ return arr.filter(function(item,index){ return arr.indexOf(item,0) == index; }); }
- 遍历+indexOf()
function unique(arr){ var newArr = []; for(var i=0;i<arr.length;i++){ if(arr.indexOf(arr[i]) == i){ newArr.push(arr[i]); } } return newArr; }
function unique(arr){ var newArr = []; for(var i=0;i<arr.length;i++){ if(newArr.indexOf(arr[i]) == -1){ newArr.push(arr[i]); } } return newArr; }
- 双层遍历
function unique(arr){ var newArr = []; for(var i=0;i<arr.length;i++){ for(var j=1;j<arr.length;j++){ if(arr[i] === arr[j]){ ++i; } } newArr.push(arr[i]); } return newArr; }
- 排序+相邻去重
function unique(arr){ arr.sort(); var newArr = [arr[0]]; for(var i=1;i<arr.length;i++){ if(arr[i] !== newArr[newArr.length-1]){ newArr.push(arr[i]); } } return newArr; }
- 递归
function unique(arr){ var copyArr = arr; var len = copyArr.length; copyArr.sort((a,b)=>{ return a-b; }); function loop(index){ if(index>0){ if(copyArr[index] === copyArr[index-1]){ copyArr.splice(index,1); } loop(index-1); } } loop(len-1); return copyArr; }
- ES6:Set数据结构
function unique(arr){ return Array.from(new Set(arr)); } //或者使用扩展符 function unique(arr){ return [...new Set(arr)]; }
- ES6:Map数据结构
function unique(arr){ let map = new Map(); let newArr = []; let len = arr.length; for(let i=0;i<len;i++){ if(map.has(arr[i])){ //判断是否存在该key值 map.set(arr[i],true); } else{ map.set(arr[i],false); newArr.push(arr[i]); } return newArr; } }