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() 高端大气上档次了?有木有?赶紧再发掘发掘更强大的用法去吧!
感谢美团、网易、腾讯供题;感谢花瓣网供图。