JS對(duì)象去重的多種方式小結(jié)
ES5 方式
在 ES5 中,我們可以使用 for
循環(huán)配合數(shù)組方法來(lái)實(shí)現(xiàn)對(duì)象數(shù)組的去重。
function uniqueArrayByProperty(array, property) { var seen = {}; return array.filter(function(item) { var val = item[property]; return seen.hasOwnProperty(val) ? false : (seen[val] = true); }); } var arr = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 1, name: 'Alice' }, // 重復(fù) { id: 3, name: 'Charlie' } ]; var uniqueArr = uniqueArrayByProperty(arr, 'id'); console.log(uniqueArr); // 輸出:[ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 3, name: 'Charlie' } ]
ES6 及之后的方式
隨著 ES6 的引入,有了更多簡(jiǎn)潔的方式來(lái)處理數(shù)組和對(duì)象。
使用 Set 和 JSON.stringify / JSON.parse
這種方法適用于簡(jiǎn)單對(duì)象,但需要注意 JSON.stringify
會(huì)丟失原型鏈上的屬性,而且對(duì)于包含循環(huán)引用的對(duì)象會(huì)拋出錯(cuò)誤。
function uniqueArrayByPropertyES6(array, property) { const seen = new Set(); return array.filter(item => { const val = JSON.stringify(item[property]); return seen.has(val) ? false : seen.add(val); }); } var uniqueArrES6 = uniqueArrayByPropertyES6(arr, 'id'); console.log(uniqueArrES6);
使用 Map
對(duì)于更復(fù)雜的對(duì)象去重,可以使用 Map
來(lái)存儲(chǔ)已經(jīng)見(jiàn)過(guò)的對(duì)象。
function uniqueArrayByPropertyWithMap(array, property) { const map = new Map(); return array.filter(item => { const val = item[property]; if (!map.has(val)) { map.set(val, true); return true; } return false; }); } var uniqueArrWithMap = uniqueArrayByPropertyWithMap(arr, 'id'); console.log(uniqueArrWithMap);
使用 Map 結(jié)合自定義比較邏輯
這種方法適用于對(duì)象具有多個(gè)屬性的情況,可以自定義比較邏輯。
function uniqueArrayByProperties(array, properties) { const seen = new Map(); return array.filter(item => { const key = properties.map(prop => item[prop]).join('|'); if (!seen.has(key)) { seen.set(key, true); return true; } return false; }); } const arr = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 1, name: 'Alice' }, // 重復(fù) { id: 3, name: 'Charlie' } ]; const uniqueArr = uniqueArrayByProperties(arr, ['id', 'name']); console.log(uniqueArr); // 輸出:[ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 3, name: 'Charlie' } ]
使用 Lodash 庫(kù)
Lodash 提供了一個(gè)方便的函數(shù) _.uniqBy
,可以輕松實(shí)現(xiàn)去重。
const _ = require('lodash'); const uniqueArr = _.uniqBy(arr, 'id'); console.log(uniqueArr); // 輸出:[ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 3, name: 'Charlie' } ]
使用 WeakMap
WeakMap
可以用來(lái)存儲(chǔ)對(duì)象引用,而不會(huì)阻止這些對(duì)象被垃圾回收。雖然 WeakMap
的鍵必須是對(duì)象,但它可以用來(lái)存儲(chǔ)已經(jīng)處理過(guò)的對(duì)象。
function uniqueArrayByPropertyWithWeakMap(array, property) { const seen = new WeakMap(); return array.filter(item => { const val = item[property]; if (!seen.has(val)) { seen.set(val, true); return true; } return false; }); } const uniqueArrWithWeakMap = uniqueArrayByPropertyWithWeakMap(arr, 'id'); console.log(uniqueArrWithWeakMap); // 輸出:[ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 3, name: 'Charlie' } ]
使用 Set 和 WeakRef (實(shí)驗(yàn)性)
在最新的 JavaScript 版本中,WeakRef
可以用來(lái)存儲(chǔ)對(duì)象的弱引用,這可以用來(lái)輔助對(duì)象的去重,但請(qǐng)注意 WeakRef
是一個(gè)實(shí)驗(yàn)性功能,可能在未來(lái)的版本中有所變化。
const { WeakRef } = require('weakref'); // 假設(shè)這是一個(gè)支持 WeakRef 的環(huán)境 function uniqueArrayByPropertyWithWeakRef(array, property) { const seen = new Set(); return array.filter(item => { const ref = new WeakRef(item[property]); if (!seen.has(ref)) { seen.add(ref); return true; } return false; }); } const uniqueArrWithWeakRef = uniqueArrayByPropertyWithWeakRef(arr, 'id'); console.log(uniqueArrWithWeakRef); // 輸出:[ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 3, name: 'Charlie' } ]
使用 Set 結(jié)合 JSON.stringify
對(duì)于簡(jiǎn)單對(duì)象,可以使用 JSON.stringify
來(lái)生成對(duì)象的字符串表示,然后使用 Set
進(jìn)行去重。
function uniqueArrayByPropertyWithSet(array, property) { const seen = new Set(); return array.filter(item => { const val = JSON.stringify(item[property]); return seen.has(val) ? false : seen.add(val); }); } const uniqueArrWithSet = uniqueArrayByPropertyWithSet(arr, 'id'); console.log(uniqueArrWithSet); // 輸出:[ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 3, name: 'Charlie' } ]
總結(jié)
以上列出了一些實(shí)現(xiàn) JavaScript 對(duì)象數(shù)組去重的不同方法(項(xiàng)目中經(jīng)常出現(xiàn)這樣的需求數(shù)組對(duì)象去重)。選擇哪種方法取決于你的具體需求和環(huán)境。對(duì)于簡(jiǎn)單的對(duì)象,使用 Set
和 JSON.stringify
可能是最簡(jiǎn)單的方式;而對(duì)于更復(fù)雜的情況,使用 Map
或者 WeakMap
可能更合適。如果使用第三方庫(kù),Lodash 的 _.uniqBy
函數(shù)提供了便捷的解決方案。對(duì)于實(shí)驗(yàn)性的功能,如 WeakRef
,則需要考慮兼容性和穩(wěn)定性問(wèn)題。
以上就是JS對(duì)象去重的多種方式小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于JS對(duì)象去重的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何使用uniapp開(kāi)發(fā)微信小程序獲取當(dāng)前位置詳解
uni-app小程序項(xiàng)目無(wú)法直接獲取到地理位置,只能通過(guò)獲取到的經(jīng)緯度,調(diào)用第三方地圖Api獲取,下面這篇文章主要給大家介紹了關(guān)于如何使用uniapp開(kāi)發(fā)微信小程序獲取當(dāng)前位置的相關(guān)資料,需要的朋友可以參考下2022-10-10淺談HBuilderX開(kāi)發(fā)小程序的一些問(wèn)題
本文主要介紹了HBuilderX開(kāi)發(fā)小程序的一些問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02JavaScript導(dǎo)航腳本判斷當(dāng)前導(dǎo)航
這篇文章主要介紹了JavaScript導(dǎo)航腳本判斷當(dāng)前導(dǎo)航的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07javascript parseInt() 函數(shù)的進(jìn)制轉(zhuǎn)換注意細(xì)節(jié)
parseInt(string, radix) 有2個(gè)參數(shù),第一個(gè)string 是傳入的數(shù)值,第二個(gè)radix是 傳入數(shù)值的進(jìn)制,參數(shù)radix 可以忽略,默認(rèn)為 10,各種進(jìn)制的數(shù)轉(zhuǎn)換為 十進(jìn)制整數(shù),接下來(lái)詳細(xì)介紹,感興趣的朋友可以了解下哦2013-01-01TypeScript語(yǔ)法詳解之類(lèi)型操作的補(bǔ)充
TypeScript最大的一個(gè)特點(diǎn)就是變量是強(qiáng)類(lèi)型的,也就是說(shuō)在聲明變量的時(shí)候我們必須給他一個(gè)類(lèi)型,下面這篇文章主要給大家介紹了關(guān)于TypeScript語(yǔ)法詳解之類(lèi)型操作的補(bǔ)充,需要的朋友可以參考下2022-08-08javascript檢測(cè)flash插件是否被禁用的方法
這篇文章主要介紹了javascript檢測(cè)flash插件是否被禁用的方法,涉及JavaScript調(diào)用ActiveXObject組件操作flash插件的相關(guān)技巧,需要的朋友可以參考下2016-01-01Javascript 兩種刷新方法以及區(qū)別和適用范圍
這篇文章主要介紹了Javascript 兩種刷新方法以及區(qū)別和適用范圍的相關(guān)資料,需要的朋友可以參考下2017-01-01