1. 程式人生 > >JS陣列去重函式

JS陣列去重函式

https://github.com/lifesinger/lifesinger.github.com/issues/113

緣由

JavaScript 陣列去重經常出現在前端招聘的筆試題裡,比如:

有陣列 var arr = ['a', 'b', 'c', '1', 0, 'c', 1, '', 1, 0],請用 JavaScript 實現去重函式 unqiue,使得 unique(arr) 返回 ['a', 'b', 'c', '1', 0, 1, '']

作為筆試題,考點有二:

  1. 正確。別小看這個考點,考慮到 JavaScript 經常要在瀏覽器上執行,在千姿百態的各種瀏覽器環境下要保障一個函式的正確性可不是一件簡單的事,不信你繼續讀完這篇部落格。

  2. 效能。雖然大部分情況下 JavaScript 語言本身(狹義範疇,不包含 DOM 等延拓)不會導致效能問題,但很不幸這是一道考題,因此面試官們還是會把效能作為一個考點。

在繼續往下閱讀之前,建議先實現一個自己認為最好的版本。


一談到優化,往往就是八仙過海、百花齊放。但八仙往往不接地氣,百花則很容易招來臭蟲。陣列去重的各種優化方案在此不一一討論,下面只說最常用效果也很不錯的一種。

function unique(arr) {
  var ret = []
  var hash = {}

  for (var i = 0; i < arr.length; i++) {
    var
item = arr[i] var key = typeof(item) + item if (hash[key] !== 1) { ret.push(item) hash[key] = 1 } } return ret }

核心是構建了一個 hash 物件來替代 indexOf. 注意在 JavaScript 裡,物件的鍵值只能是字串,因此需要 var key = typeof(item) + item 來區分數值 1 和字串 '1' 等情況。