js数组去重也是老生常谈的话题了,怎么驱虫涅,最容易想到的就是直接新建一个数组,存放去重后的数组。由于NaN这种神奇的数字连他自己都不认识自己,所以目标数组如果需要去重NaN,需要用isNaN来判断一下,ok,码归正传,代码如下:
function unique01(arr){ if(Array.isArray(arr)){ var result = []; var flag = true; for(var i=0;i<arr.length;i++){ if(result.indexOf(arr[i])===-1){ if(isNaN(arr[i])&&flag){ result.push(arr[i]); flag = false; } else if(isNaN(arr[i])){ continue; } else{ result.push(arr[i]); } } } return result; } else{ return false; } }
这种方法虽然实现上没太大难度,缺点确实很明显,一是不够快,时间复杂度O(n)2。二是费空间,需要新开一个数组来存放结果。
怎么才能不费空间呢,直接在原数组上操作,最后返回这个数组,嗯,思路有了,就看如何实现了,继续放码..
function unique02(arr){ if(Array.isArray(arr)){ var flag = true; for(var i=arr.length-1;i>0;i--){ if(isNaN(arr[i])){ flag = false; } for(var j=0;j<i;j++){ if(isNaN(arr[j])&&(flag===false)){ arr.splice(i,1); } else if(arr[j]===arr[i]){ arr.splice(i,1); } } } return arr; } else{ return false; } }
仔细看看,这个操作还是有点水平的,虽然时间复杂度依然是O(n)2,起码空间不浪费了,当然,我们的目标不会止步于此的
function unique03(arr){ if(Array.isArray(arr)){ var result=[],obj={},val,type; for(var i=0;i<arr.length;i++){ val = arr[i]; type = typeof arr[i]; if(!obj[val]){ obj[val] = [type]; result.push(val); } else if(obj[val].indexOf(type)==-1){ obj[val].push(type); result.push(val); } } return result; }else{ return false; } }
是不是更6了,没错,这次我们把时间复杂度降到了O(n),不过有点遗憾的是空间浪费的有点多,用空间的代价换取时间。究竟值不值呢,你说了算。
当然,没有最6,只有更6,ES6中的代码其实这样写
function unique04(arr) { return Array.from(new Set(arr)) }
是的,你没有看错,只有一行,一行代码,搞定一切,就是这个feel。