有一天有一個朋友給我發來訊息 “陣列物件根據物件中指定的屬性去重?讓我寫寫看”,看到這個的時候我有點懵逼,好像不太會。
我只能咬著牙硬著頭皮死磕,差點從入門到放棄,在朋友一步一步指導下面終於寫好了,朋友總結好了發了我一份,本著自願共享的精神。過來兩天我就把這個給忘了
在專案中剛好遇到這個東西,那時候腦子僅剩一點點的思路,努力回想時卻早已記憶模糊。很無奈呀,怎麼辦?專案開發需要,硬著頭皮又找朋友要了一份哈哈。現在我決定我要建立一個自己的 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
}
複製程式碼
方法四: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…