日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Javascript系列——对象元素的数组去重实现

發(fā)布時(shí)間:2023/12/13 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Javascript系列——对象元素的数组去重实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

概要

這是一篇記錄文,記錄數(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。