js|將數組扁平化並去除其中重複數據,最終得到一個升序且不重複的數組/二維數組去重

set方法

  • new一個Set對象,set方法去重,set方法只能去重一維數組
  • flat方法扁平化,Infinity規定數組長度的限制
  • sort方法正序排列,
  • 最後把對象轉化成數組:
var arry =[1,25,15,[1,2,15,5],15,25,35,1];
var set =new Set(arry.flat(Infinity).sort((a,b)=>(a-b)));
var arr= [...set];
:
console.log(arr)// [1, 2, 5, 15, 25, 35]

錯誤示例:

arr.toString().split(",").sort((a,b)=>{ return a-b})

原因:

  1. split()方法是把字符串分割成字符數組,所以最後的排序是根據字符串的編碼來排序,輸出的也是字符串數組
  2. 這個方法也沒有去重

鍵值對方法(二維數組)

這裏是二維數組,二維數組去重比較特殊,不能使用set(Set 對象允許你存儲任何類型的唯一值,無論是原始值或者是對象引用。),實驗結果set只能去掉第一個重複的數組(???)

  • 通過對象的鍵值對來實現二維數組去重,首先新建一個空對象,作爲對照;
  • 然後遍歷數組,對每個元素判斷對象裏面是否有對應的key,有的話,就代表這個元素被遍歷到過,從原來數組裏刪掉這個重複的元素,然後i–(否則會漏過下一個元素)
  • 沒有的話,把這個obj【key】=1,作爲對照。
  • 出口:遍歷完成,原數組重複元素被刪除。
  let obj = {};//對照對象
  for (var i = 0; i < result2.length; i++) {
    // 判斷當前項是否遍歷過,是則刪除,否存入obj以作對照

    if (obj[result2[i]]) {
      result2.splice(i, 1);
      i--; //數組刪除了一項,要把i回退一下,不然會跳過下一項不去遍歷
    } else {
      obj[result2[i]] = 1;
    }
  }
 

參考:Map和Set:https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/0014345007434430758e3ac6e1b44b1865178e7aff9082e000/
github原題:https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/8

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章