陣列物件根據物件中指定的屬性去重?你知道多少

sunseekers發表於2018-10-18

有一天有一個朋友給我發來訊息 “陣列物件根據物件中指定的屬性去重?讓我寫寫看”,看到這個的時候我有點懵逼,好像不太會。

我只能咬著牙硬著頭皮死磕,差點從入門到放棄,在朋友一步一步指導下面終於寫好了,朋友總結好了發了我一份,本著自願共享的精神。過來兩天我就把這個給忘了

在專案中剛好遇到這個東西,那時候腦子僅剩一點點的思路,努力回想時卻早已記憶模糊。很無奈呀,怎麼辦?專案開發需要,硬著頭皮又找朋友要了一份哈哈。現在我決定我要建立一個自己的 js 小倉庫,裡面就放我不懂的,有事沒事去翻翻,溫故

喜歡和朋友交流,偶爾會拋一些技術問題給我,我不會,每次都在指導下慢慢的一步一步明白懂了,順便學到了新知識。哈哈一起學習進步,歡迎技術交流

問題:陣列物件根據物件中指定的屬性去重?

方法一: reduce 方法

function unique(arr,u_key){
  let obj = {}
  arr.reduce((prev,next)=>{
    obj[next[u_key]+typeof next[u_key]] ?  '' :
    obj[next[u_key]+typeof next[u_key]] = true && prev.push(next)
    return prev 
  },[])
}
複製程式碼

push 方法是返回新陣列的長度,&& 返回的是後面那個值,而我們需要的是一個第一次執行的陣列物件,所以另寫了一行 return prev

方法二: 計數器原理

function unique(arr,u_key){
  let result = []
  result[0] = arr[0]
  arr.forEach((meta_item,i)=>{
    //宣告計數變數,如果源陣列中的一個物件和result結果陣列中的所有物件不同,就push
    let num = 0
    result.forEach((r_item,j)=>{
      if (meta_item[u_key]!==r_item[u_key]) {
        num++
      }
      if (num === result.length) {
        result.push(meta_item)
      }
    })
  })
  return result
}
複製程式碼

方法三 : 簡單粗暴迴圈,利用原理是物件的同名屬性會被覆蓋(和第一種方法有點像)

function unique(arr,u_key) {
  let obj = {}
  let result = []
  arr.forEach(item=>{
    let typeof_key = typeof item[u_key] + item[u_key]
    obj[typeof_key] = item
  })
  for (let key in obj) {
    result.push(obj[key])
  }
  return result
}
複製程式碼

方法四:ES6Map

function unique(arr,u_key) {
  let map = new Map()
  arr.forEach((item,index)=>{
    if (!map.has(item[u_key])){
      map.set(item[u_key],item)
    }
  })
  return [...map.values()]
}
複製程式碼

這個方法是我 Java 同事看了我掘金以後給出的答案,或許這就是大佬吧,對於 ES6mapset,我只知道有這個東西,未曾深入瞭解過。自愧不如,JavaES6 玩的比我還好,我要一頭扎入學習的海洋,到達他的高度 測試案例

let arrayList = [{
  id:'1',
  name:'one'
},{
  id:'2',
  name:'tow',
},{
  id:'3',
  name:'three'
},{
  id:'1',
  name:'one'
},{
  id:2,
  name:'tow',
},{
  id:'3',
  name:'three'
}]
unique(arrayList,'id')
複製程式碼

來自萌新的瑟瑟發抖,如有不對之處,希望可以指出,如果有其他的更好的方法,期待可以學習交流

文章地址

我的部落格即將同步至騰訊雲+社群,邀請大家一同入駐:cloud.tencent.com/developer/s…

相關文章