數組去重----es6&es5&數組對象去重

es6方法:es6

普通數組:數組

1.使用Array.from(new Set(arr));ui

/*
* @param oldArr 帶有重複項的舊數組
* @param newArr 去除重複項以後的新數組
* */
let oldArr = [1, 1, 1, 2, 3, 2, 4, 4, 4, 9, 9, 0, 0, NaN, NaN];
let newArr = Array.from(new Set(oldArr));
console.log(newArr);  // [1, 2, 3, 4, 9, 0, NaN]

解釋:this

Set對象

Set對象容許存儲任何類型的惟一值,不管是原始值或者是對象引用。它能夠是任何類型的單個值的集合。Set中的元素只會出現一次,即Set中的元素是惟一的。
語法:new Set([iterable]);
參數:iterable,若是傳遞一個可迭代對象(包括 Array,Map,Set,String,TypedArray,arguments 對象等等),它的全部元素將被添加到新的 Set中。若是不指定此參數或其值爲null,則新的Set爲空。spa

let testArr = [0, 1, 1, 2, 3, 3, 3, 3, 4, NaN, NaN, undefined, undefined];
let setTestArr = new Set(testArr);
console.log(setTestArr);  // Set(7) {0,1, 2, 3, 4, NaN, undefined}
from對象

Array.from()方法從一個相似數組或可迭代的對象(包括 Array,Map,Set,String,TypedArray,arguments 對象等等) 中建立一個新的數組實例。.net

let testArr = [1, 1, 2, 3, 3, 3, 3, 4, NaN, NaN, undefined, undefined];
let setTestArr = new Set(testArr);
console.log(setTestArr);  // {1, 2, 3, 4, NaN, undefined}

let newArr = Array.from(setTestArr);
console.log(newArr);  // [1, 2, 3, 4, NaN, undefined]

es6之前:prototype

方法一:code

先排序,後比較, 缺點:獲得了排序後的數組,打亂原有的順序htm

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
    nums.sort()
    for(var i=0;i<nums.length;i++){
        if(nums[i]===nums[i+1]){
            nums.splice(i,1)
            i=i-1;
        }
    }
};

 

方法二:對象

雙層循環,外層循環元素,內層循環時比較值

若是有相同的值則跳過,不相同則push進數組

Array.prototype.distinct = function(){
 var arr = this,
  result = [],
  i,
  j,
  len = arr.length;
 for(i = 0; i < len; i++){
  for(j = i + 1; j < len; j++){
   if(arr[i] === arr[j]){
    j = ++i;
   }
  }
  result.push(arr[i]);
 }
 return result;
}
var arra = [1,2,3,4,4,1,1,2,1,1,1];
arra.distinct();    //返回[3,4,2,1]

 

方法三:利用splice直接在原數組進行操做

雙層循環,外層循環元素,內層循環時比較值

值相同時,則刪去這個值

注意點:刪除元素以後,須要將數組的長度也減1.

Array.prototype.distinct = function (){
 var arr = this,
  i,
  j,
  len = arr.length;
 for(i = 0; i < len; i++){
  for(j = i + 1; j < len; j++){
   if(arr[i] == arr[j]){
    arr.splice(j,1);
    len--;
    j--;
   }
  }
 }
 return arr;
};
var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,];
var b = a.distinct();
console.log(b.toString()); //1,2,3,4,5,6,56

 

方法四:利用indexOf以及forEach

Array.prototype.distinct = function (){
 var arr = this,
  result = [],
  len = arr.length;
 arr.forEach(function(v, i ,arr){  //這裏利用map,filter方法也能夠實現
  var bool = arr.indexOf(v,i+1);  //從傳入參數的下一個索引值開始尋找是否存在重複
  if(bool === -1){
   result.push(v);
  }
 })
 return result;
};
var a = [1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,2,3,3,2,2,1,23,1,23,2,3,2,3,2,3];
var b = a.distinct();
console.log(b.toString()); //1,23,2,3

 

數組對象去重-----多個數組對象比較能夠先利用concat合併

方法三:利用對象的屬性不能相同的特色進行去重-----適用於數組對象

Array.prototype.distinct = function (){
 var arr = this,
  i,
  obj = {},
  result = [],
  len = arr.length;
 for(i = 0; i< arr.length; i++){
  if(!obj[arr[i]]){ //若是能查找到,證實數組元素重複了
   obj[arr[i]] = 1;
   result.push(arr[i]);
  }
 }
 return result;
};
var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,];
var b = a.distinct();
console.log(b.toString()); //1,2,3,4,5,6,56

 

參考:

https://www.jb51.net/article/118657.htm

https://itpoet.cn/2018/01/17/es6-array-eliminate-redundancy/#more

相關文章
相關標籤/搜索