返回课程

过滤数组中的唯一成员

重要性: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 中,我们将看到如何优化它。

在沙盒中打开带有测试的解决方案。