如何檢查數組是否有重複值

在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) // 沒有包含關係
  })
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章