在JavaScript中處理數組時,有時我們想確定該數組是否包含任何重複值。不幸的是,JavaScript數組沒有任何內置方法可以爲我們做到這一點,我們必須自己編寫實現。
解決此問題一種方法如下所示:
function checkForDuplicates(array) {
let valuesAlreadySeen = []
for (let i = 0; i < array.length; i++) {
let value = array[i]
if (valuesAlreadySeen.indexOf(value) !== -1) {
return true
}
valuesAlreadySeen.push(value)
}
return false
}
這種方式是可行的,但是在最壞的情況下,也就是重複值出現在數組的末尾,我們將不得不遍歷整個數組(O(n)這n可能是巨大的!),只有遍歷到在最後一個元素上,數組中才存在一個非唯一值。這不是一種非常有效的方法。
另一種方法利用了ES6 Set的功能。
如果您不熟悉JavaScript中的Set,這是MDN定義:
Set對象是值的集合。您可以按插入順序遍歷集合的元素。集合中的值只能出現一次;它在Set的集合中是唯一的。
根據這個特點意味着我們可以將原始數組轉換爲Set,然後它僅包含唯一值。一旦從數組中提取了所有唯一值並將它們存儲在Set中,我們就可以比較數組和Set的長度。如果長度不同,則說明該數組包含重複值!
這種方法如下所示:
function checkForDuplicates(array) {
return new Set(array).size !== array.length
}
如果Set的長度與數組的長度不同,則此函數將返回true,表示數組確實包含重複項。否則,如果數組和Set的長度相同,則該函數將返回false,我們可以確定原始數組中沒有重複的值!
其實Set這種數據結構非常適合求數組的交集,並集,差集。
交集
function insertion (a, b) {
a = new Set(a);
b = new Set(b);
[...a].filter(item => {
return b.has(item) // 有包含關係
})
}
並集
let a = [1, 2, 3]
let b = [3, 4, 5]
function union (a, b) {
let newArr = [...new Set([...a, ...b])]
return newArr
}
union(a, b)
差集
function difference (a, b) {
a = new Set(a);
b = new Set(b);
[...a].filter(item => {
return !b.has(item) // 沒有包含關係
})
}