JavaScript 数组的 sort 方法妙用两则

ZD


ZD
最近的面试中,针对JS的考察,遇到两个不同的问题:第一个是如何对一个数组高效率的去重?第二个是有2n+1个数,其中2n个都是成对的,找出那个不成对的数。
针对第一个题,估计很多人第一时间会想到用一个hash对象来存储唯一值,简单易行,但是效率略差。那么用sort大法怎么做呢?
不急,先来欣赏一下由瑞士艺术家 Ursus Wehrli 的艺术作品整理强迫症:『让杂乱无章变得有序起来』
有没有蛋疼的感觉?有木有?
回来说第一题,高效数组去重,
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 的艺术作品整理强迫症:『让杂乱无章变得有序起来』给大家欣赏,
欣赏完艺术作品,是不是觉得又有点隐隐的
咱们再来看看码工怎么解决第二个问题,
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() 高端大气上档次了?有木有?赶紧再发掘发掘更强大的用法去吧!
感谢美团、网易、腾讯供题;感谢花瓣网供图。