Javascript系列——对象元素的数组去重实现
概要
這是一篇記錄文,記錄數(shù)組操作對(duì)象去重的實(shí)現(xiàn)。
需求
有這樣一個(gè)數(shù)組
[{_id: 123,name: '張三' },{_id: 124,name: '李四' },{_id: 123,name: '張三' }]實(shí)際上我們只需要
[{_id: 123,name: '張三' },{_id: 124,name: '李四' }]去重
簡(jiǎn)單數(shù)組的去重
Array.from(new Set([1,1,2,3,4,4])) // [1,2,3,4]以對(duì)象為元素的數(shù)組去重
和數(shù)組相關(guān)的算法多種多樣,在你以為自己已經(jīng)掌握數(shù)組之后,會(huì)發(fā)現(xiàn)很多和數(shù)組相關(guān)的算法仍舊很復(fù)雜。
下面我將講述一個(gè)入門等級(jí)的數(shù)組算法,解決上面提出的需求。
1、定義一個(gè)函數(shù)removeRepeat,它需要傳入2個(gè)參數(shù),arr表示需要去重的數(shù)組,field表示需要比較的key。比如我們的需求是比較 _id 是否有重復(fù)。
function removeRepeat(arr, field){return arr }2、需要一個(gè)空數(shù)組,用來(lái)存儲(chǔ)每個(gè)對(duì)象元素中field對(duì)應(yīng)的value。
let s = [] for(let v of arr){s.push(v[field]) } //s = [123, 124, 123]3、將所有field的值存到數(shù)組之后,它們的下標(biāo)一一對(duì)應(yīng)原數(shù)組的下標(biāo)(這點(diǎn)很重要),接著我們需要2個(gè)對(duì)象集合,result用來(lái)存儲(chǔ)s里遍歷出來(lái)的元素,如果有重復(fù),就將重復(fù)的元素丟到reSet對(duì)象里面。
let result = {}, reSet = {} for(let i=0,len=s.length;i<len;i++){if(!result[s[i]] && result[s[i]] !== 0) {//如果result不存在當(dāng)前的key并且它不為0時(shí)result[s[i]] = i} else {reSet[s[i]] = i} } // result = {123: 0, 124: 1} 這是去重重復(fù)后的元素 // reSet = {123: 2} 我們將重復(fù)的元素123作為key,它的下標(biāo)2作為value。4、上一步得到了result和reSet2個(gè)對(duì)象,那么,我們?cè)撚媚膫€(gè)對(duì)象來(lái)處理原數(shù)組的去重呢?只需要reSet,reSet記錄了要去重的對(duì)象所在的下標(biāo),那么可以直接用splice干掉它。
for(let key in reSet){arr.splice(reSet[key], 1) } /* arr = [{_id: 123,name: '張三' },{_id: 124,name: '李四' }] */5、說(shuō)明
關(guān)鍵的第3和4步,都是用對(duì)象來(lái)處理,這樣做的好處是時(shí)間復(fù)雜度可以達(dá)到O(1),如果用數(shù)組來(lái)保存,則需要2個(gè)for循環(huán),時(shí)間復(fù)雜度變成了O(n2)。
完整源碼
function removeRepeat(arr, field){let s = [], result = {}, reSet = {}for(let v of arr){s.push(v[field])}for(let i=0,len=s.length;i<len;i++){if(!result[s[i]] && result[s[i]] !== 0) {result[s[i]] = i} else {reSet[s[i]] = i}}for(let key in reSet){arr.splice(reSet[key], 1)}return arr }// removeRepeat(arr, '_id')補(bǔ)充
受到各路大神的解法影響,我也針對(duì)上面代碼的不足做了修改。
1、更簡(jiǎn)潔的代碼。
2、支持多個(gè)重復(fù)對(duì)象的去重,缺點(diǎn)是會(huì)改變?cè)瓉?lái)的排序。
const removeRepeat = (arr, field) => {let s = {}for(let i=0,len=arr.length;i<len;i++){s[arr[i][field]] = arr[i]}return Object.values(s) }總結(jié)
數(shù)組還有各種有趣的操作,也經(jīng)常作為各大公司考察的題型之重,多練習(xí)和數(shù)組相關(guān)的算法會(huì)很有幫助。
原文地址:https://segmentfault.com/a/1190000012873968
轉(zhuǎn)載于:https://www.cnblogs.com/lalalagq/p/9959426.html
總結(jié)
以上是生活随笔為你收集整理的Javascript系列——对象元素的数组去重实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在原生js中的事件监听方法
- 下一篇: java美元兑换,(Java实现) 美元