數組去重--這幾種方法夠不?

數組去重,是校招面試的必考知識點。簡單的說,數組去重就是將一個數組中的相同的元素刪除,只保留其中的一個。這裏的相同實際上是一個陷阱,有好多同窗只認爲值相等即爲相同,而忽略類類型的判斷。因此你們在進行數組去重的時候,必定要考慮周全。如下,就是筆者所實現的數組去重的幾種簡單的方式。前端


一、Set實現

第一種方法就是使用es6新增的Array.from()new Set()。若是如今你還不瞭解es6,那你可真是out了。建議閱讀ECMAScript 6 入門或者learn-es2015git

Array.prototype.unique = function() {
  return Array.from(new Set(this));
}

二、結合{}實現

這種方法的關鍵點就是:判斷是否相同的時候,不要忽略對元素類型的判斷。es6

Array.prototype.unique = function() {
  var json = {};
  var result = [];
  this.forEach(function(value){
    var type = Object.prototype.toString.call(value).match(/\s(\w+)/)[1].toLowerCase();
    if(!((type + '-'+value) in json)){
      json[type + '-'+value] = true;
      result.push(value);
    }
  })
  return result;
}

三、利用Array.prototype.filter實現

filter是es5中新增的數組的一個方法。不瞭解的同請閱讀Array.prototype.filter()github

Array.prototype.unique = function() {
  var sortArr = this.sort();
  return sortArr.filter(function(v,i,context){
    return v !== context[i+1];
  })
}

四、利用Array.prototype.forEach實現

includes也是es6新增的方法。不瞭解的同請閱讀Array.prototype.includes()面試

Array.prototype.unique = function() {
  var result = [];
  this.forEach(function(v){
    if(!result.includes(v)){
      result.push(v);
    }
  })
  return result;
}

五、利用Array.prototype.splice()實現

這個方法是一個很常規的方法,關鍵點就是在splice一個元素以後,i要自減1。json

Array.prototype.unique = function() {
  var sortArr = this.sort(),
    i = 0;
  for(; i < sortArr.length; i++){
    if(sortArr[i] === sortArr[i+1]){
      sortArr.splice(i,1);
      i--;
    }
  }
  return sortArr;
}

六、利用Array.prototype.reduce()實現

reduce是es5中新增的數組的一個方法。不瞭解的同窗請閱讀Array.prototype.reduce()數組

Array.prototype.unique = function() {
  var sortArr = this.sort(), result = [];
  sortArr.reduce((v1,v2) => {
    if(v1 !== v2){
      result.push(v1);
    }
    return v2;
  })
  result.push(sortArr[sortArr.length - 1]);
  return result;
}

以上就是筆者所想到的幾個數組去重的方式,你們若是有更好的方法,歡迎留言。也能夠去個人github的倉庫snippetspr,這個倉庫主要用於前端代碼片斷的蒐集,歡迎你們踊躍貢獻。babel

相關文章
相關標籤/搜索