JavaScript 数组的 sort 方法妙用两则

最近的面试中,针对JS的考察,遇到两个不同的问题:第一个是如何对一个数组高效率的去重?第二个是有2n+1个数,其中2n个都是成对的,找出那个不成对的数。

针对第一个题,估计很多人第一时间会想到用一个hash对象来存储唯一值,简单易行,但是效率略差。那么用sort大法怎么做呢?

不急,先来欣赏一下由瑞士艺术家 Ursus Wehrli 的艺术作品整理强迫症:『让杂乱无章变得有序起来』

sort 1

有没有蛋疼的感觉?有木有?

回来说第一题,高效数组去重,

Array.prototype.distinct=function() { var _self = this.concat(); var _temp = this.concat().sort(); _temp.sort(function(a,b){ if(a==b) { _self.splice(_self.indexOf(a),1); } }); return _self; }

利用自然的排序,就把数组中重复的比出来,直接从副本中删除,啧啧,这效率,杠杠滴。

进阶一点的话,就像美团同学出的题,去重的时候还要考虑类型的一致,如 var a = [1, 2, '1', 2, 'a'] 这种去重,简单去的话,会变成 [1, 2, 'a'],因为在JS中 1 == ‘1’ 的结果是 true, 那么考虑不同数据类型的话,结果就应该是 [1, 2, '1', 'a']。在我们这个方法中稍做改动,就可以顺便把类型也给判断了,如下,

Array.prototype.distinct=function() { var _self=this; var _temp=this.concat().sort(); _temp.sort(function(a,b){ if(a===b) { _self.splice(_self.indexOf(a),1); } }); return _self; }

怎么样,有木有觉得碉堡了?

来看第二题,同样,又准本了一幅由瑞士艺术家 Ursus Wehrli 的艺术作品整理强迫症:『让杂乱无章变得有序起来』给大家欣赏,

sort-2

欣赏完艺术作品,是不是觉得又有点隐隐的

咱们再来看看码工怎么解决第二个问题,

var da = [1,2,3,4,3,4,2], daa = da.concat(); daa.sort(function(a, b) { if (a == b) { while (da.indexOf(a) > -1) { da.splice(da.indexOf(a), 1) } return 0; }else { return a - b; } });

经过一次对’da’的副本’daa’ 的排序调用,把da中的重复元素全部剔除,剩下就是那个不成对的 [1] 了吧。

嗯,这下是不是觉得 Array.sort() 高端大气上档次了?有木有?赶紧再发掘发掘更强大的用法去吧!

感谢美团、网易、腾讯供题;感谢花瓣网供图。

© 2022, Bill X.