簡單數據類型去重
簡單數據類型去重邏輯如下,相應的對比復雜數據類型,只需要需改判斷兩個值是否相等的邏輯即可
Set
使用 Set(),將創建一個唯一值的實例,隱式使用此實例將刪除重復項
let charsArr = ['A', 'B', 'C', 'B', 'C']
let deduplicateArr = [...new Set(charsArr)]
console.log(deduplicateArr)
Output:
['A', 'B', 'C']
indexOf()和filter()
indexOf()方法返回數組中元素第一次出現的索引;為了消除重復項,filter()方法用于僅包含其索引與其 indexOf 值匹配的元素,filer 方法會根據對其執行的操作返回一個新數組
let charsArr = ['A', 'B', 'C', 'B', 'C']
let deduplicateArr = charsArr.filter((element, index) => {
return charsArr.indexOf(element) !== index
})
console.log(deduplicateArr)
Output:
['A', 'B', 'C']
includes()和forEach()
如果元素在數組中,則 include() 函數返回 true,如果元素不在數組中,則返回 false
let charsArr = ['A', 'B', 'C', 'B', 'C']
let deduplicateArr = []
charsArr.forEach((element) => {
if (!deduplicateArr.includes(element)) {
deduplicateArr.push(element)
}
})
console.log(deduplicateArr)
Output:
['A', 'B', 'C']
vue響應式數據去重
在 Vue.js 中使用響應式數組,數組中的每個對象或者元素都會被包裝成響應式對象,這意味著當對象的屬性發生變化時,視圖會自動更新
function uniqueArray(arr) {
// 判斷是否為響應式數組
const isVueArray = Array.isArray(arr) && arr.__ob__
// 去重函數
function filterUnique(arr) {
return arr.filter((item, index, self) =>
index === self.findIndex((t) => (
isVueArray ? JSON.stringify(t) === JSON.stringify(item) : t === item
))
)
}
if (Array.isArray(arr)) {
// 簡單數據類型數組或非響應式對象數組
if (!isVueArray) {
return Array.from(new Set(arr))
} else {
// Vue.js 或類似框架的響應式數組
return filterUnique(arr.slice())
}
} else {
// 處理復雜對象數組的情況
if (arr instanceof Object) {
const keys = Object.keys(arr)
const filteredKeys = filterUnique(keys)
const result = {};
filteredKeys.forEach(key => {
result[key] = arr[key]
});
return result
} else {
return arr
}
}
}
海量數據數組去重
分塊處理
分塊處理方法適用于無法一次性加載所有數據到內存的情況,比如處理文件或者通過網絡獲取數據。
步驟:
1.將數據分塊加載:將海量數據按照一定的塊大小(例如每次處理1000條記錄)逐塊加載或者流式獲取。
2.使用哈希表進行局部去重:對每個塊內的數據使用哈希表進行去重。哈希表可以是 Map 或者普通對象。
function deduplicateChunk(chunk) {
let seen = new Map()
let uniqueChunk = []
for (let item of chunk) {
if (!seen.has(item)) {
seen.set(item, true)
uniqueChunk.push(item)
}
}
return uniqueChunk
}
3.合并去重后的結果:將每個塊去重后得到的結果合并起來。
function deduplicateLargeArray(arr, chunkSize) {
let deduplicatedArray = []
for (let i = 0; i < arr.length; i += chunkSize) {
let chunk = arr.slice(i, i + chunkSize)
let deduplicatedChunk = deduplicateChunk(chunk)
deduplicatedArray.push(...deduplicatedChunk)
}
return deduplicatedArray
}
4.返回最終去重后的數組:將所有塊處理完畢后得到的去重結果返回。
注意事項:
1.性能考慮:分塊處理可以降低內存使用,并且使得每個塊的去重操作的時間復雜度保持在合理范圍內。
2.哈希沖突:當數據量非常巨大時,哈希沖突可能會增加。可以考慮使用更復雜的哈希函數或者結合其他方法來處理。
流式處理方法
流式處理方法適用于實時生成數據或者通過迭代器逐條獲取數據的場景。該方法不需要一次性加載全部數據,而是邊處理邊輸出結果。
示例偽代碼:
function* deduplicateStream(arr) {
let seen = new Map()
for (let item of arr) {
if (!seen.has(item)) {
seen.set(item, true)
yield item
}
}
}
這種方法通過生成器函數(Generator)實現流式輸出去重結果,可以有效處理大規模數據而不會導致內存溢出。當然也有很多解,上述只是其中一個解
對于海量數據的復雜數組去重,分塊處理或者流式處理是兩種常用的方法。選擇合適的方法取決于數據的來源和處理方式,通常需要根據實際情況來進行調整和優化,以確保內存使用和性能都能夠達到預期的效果。