过滤数组中的唯一成员
重要性: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 中,我们将看到如何优化它。