數組對象根據對象中指定的屬性去重?你知道多少

有一天有一個朋友給我發來消息 「數組對象根據對象中指定的屬性去重?讓我寫寫看」,看到這個的時候我有點懵逼,好像不太會。git

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

在項目中恰好遇到這個東西,那時候腦子僅剩一點點的思路,努力回想時卻早已記憶模糊。很無奈呀,怎麼辦?項目開發須要,硬着頭皮又找朋友要了一份哈哈。如今我決定我要創建一個本身的 js 小倉庫,裏面就放我不懂的,有事沒事去翻翻,溫故數組

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

問題:數組對象根據對象中指定的屬性去重?學習

方法一: 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 prevui

方法二: 計數器原理spa

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
}
複製代碼

方法三 : 簡單粗暴循環,利用原理是對象的同名屬性會被覆蓋(和第一種方法有點像)code

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…

相關文章
相關標籤/搜索