返回課程

過濾陣列中獨特的成員

重要性:4

假設 arr 為一個陣列。

建立一個函式 unique(arr),它會傳回一個陣列,其中包含 arr 中的獨特項目。

例如

function unique(arr) {
  /* your code */
}

let strings = ["Hare", "Krishna", "Hare", "Krishna",
  "Krishna", "Krishna", "Hare", "Hare", ":-O"
];

alert( unique(strings) ); // Hare, Krishna, :-O

開啟一個包含測試的沙盒。

讓我們遍歷陣列項目

  • 對於每個項目,我們將檢查結果陣列中是否已包含該項目。
  • 如果是,則忽略,否則新增至結果中。
function unique(arr) {
  let result = [];

  for (let str of arr) {
    if (!result.includes(str)) {
      result.push(str);
    }
  }

  return result;
}

let strings = ["Hare", "Krishna", "Hare", "Krishna",
  "Krishna", "Krishna", "Hare", "Hare", ":-O"
];

alert( unique(strings) ); // Hare, Krishna, :-O

這段程式碼可以運作,但其中存在潛在效能問題。

方法 result.includes(str) 在內部會遍歷陣列 result,並將每個元素與 str 進行比較以尋找相符項目。

因此,如果 result 中有 100 個元素,且沒有任何元素與 str 相符,則它將遍歷整個 result 並執行恰好 100 次比較。如果 result 很大的話,例如 10000,則將執行 10000 次比較。

這本身並不是問題,因為 JavaScript 引擎非常快,所以遍歷 10000 個陣列只需要幾微秒。

但是,我們會在 for 迴圈中對 arr 的每個元素執行此類測試。

因此,如果 arr.length10000,我們將得到類似 10000*10000 = 1 億次比較。這是一個很大的數字。

因此,此解決方案僅適用於小陣列。

在章節 Map 和 Set 中,我們將進一步瞭解如何對其進行最佳化。

在沙盒中開啟包含測試的解決方案。