過濾陣列中獨特的成員
重要性: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.length
為 10000
,我們將得到類似 10000*10000
= 1 億次比較。這是一個很大的數字。
因此,此解決方案僅適用於小陣列。
在章節 Map 和 Set 中,我們將進一步瞭解如何對其進行最佳化。