有一天有一個朋友給我發來消息 「數組對象根據對象中指定的屬性去重?讓我寫寫看」,看到這個的時候我有點懵逼,好像不太會。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 prev
ui
方法二: 計數器原理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
}
複製代碼
方法四:ES6
的 Map
對象
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
同事看了我掘金之後給出的答案,或許這就是大佬吧,對於 ES6
的map
,set
,我只知道有這個東西,不曾深刻了解過。自愧不如,Java
玩 ES6
玩的比我還好,我要一頭扎入學習的海洋,到達他的高度 測試案例
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…