- 今天咱么分享下数组去重,这个问题基本每次面试都会被问到,那我们如何以压倒性的优势回答这个问题呢?
- 老规矩,需求,分析需求
- 需求:数组去重
- 分析需求:没啥可分析的,这不废话吗。小尴尬一下子。
- 回答问题是一门技术,咱们来分析下这种技术。
- 开撸
- 开胃菜,首先你第一种应该说的方式就是,硬去重,你说完这种方式,面试官会觉得你很low
var arr = [1,1,'a','a'] Array.prototype.unique = function () { var res = [] //先把数组的长度缓存出来,好处就不扯了 var len = this.length for (var i = 0; i < len; i++) { //的到缓存数组的长度 var tempLen = temp.length for (var j = 0; j < tempLen; j++) { if (this[i] === temp[j]) { break; } } if (j === tempLen) { temp.push(this[i]) } } return res } </script>
- 当你写出这样的数组去重,面试官小哥哥,肯定是不太满意的哦,来一句,还有其他办法吗?
- 莫慌莫慌有...利用es5给我们提供的filter方法
Array.prototype.unique = function () { var self = this var res = this.filter((item, index) => this.indexOf(item) === index) return res; } console.log(arr.unique())
- 这个时候面试官小哥哥,对你的好感会上升一点点哦,在来一句,还有其他办法吗?
- 莫慌,莫慌,有...利用 reduce 方法也是可以数组去重的
Array.prototype.unique = function () { var res = this.sort().reduce((pre, current) => { if (pre.length === 0 || pre[pre.length - 1] !== current) { pre.push(current); } return pre; }, []) return res } console.log(arr.unique())
- 默默的秀了一下子,接着不要等小哥问你了呗,其实上边的方法虽都能达到去重的目的,但是算法时间复杂度都是一样的,都不是太好
- 我们可以利用完全hash的算法,利用对象的属性都是唯一的这个特性来实现数组去重
Array.prototype.unique = function(){ var temp = {} var res = [] var len = this.length for(var i = 0; i < this.length; i++){ if(temp[this[i]] == undefined){ temp[this[i]] = "abc" res.push(this[i]) } } return res }
- 渐入佳境了,再来一种,es6为我们提供了set这种数据结构,我们可以用它来实现数组去重
Array.prototype.unique = function(){ return Array.from(new Set(this)); }
- 还有几种方法,不一一列举了。
- 最后在升华一下子,其实上边的这些数组去重是有问题的,比如数组的元素中,有那种特殊的元素,比如 undefined,null,NaN(这玩意自己不等于自己)这样的就不能达到完全去重的目的。这里就不一一试了,拿怎么办呢?
-记住,脱离了业务场景的技术都是耍流氓,根据自己的数据结构,在合适的场景要选择合适的方法。 - 这就是今天的数组去重,如果有错误或者不严谨的地方,希望大家给予指正,十分感谢。
网友评论