返回

JavaScript 数组去重的七种巧妙算法,重构思维,精益求精!

前端

七种 JavaScript 数组去重算法:从基础到 ES6

引言

在 JavaScript 中,数组是存储有序数据的基本构建块。然而,有时我们需要处理包含重复元素的数组。为了获取唯一元素的集合,我们需要对数组进行去重操作。本文将介绍七种不同的 JavaScript 数组去重算法,从基本遍历方法到利用 ES6 特性的高级方法。

1. 基本遍历

最直接的去重方法是使用基本遍历。该算法通过比较数组中每个元素与其他元素来工作。如果发现重复项,则将其删除。

function removeDuplicates(arr) {
  let uniqueArray = [];
  for (let i = 0; i < arr.length; i++) {
    if (uniqueArray.indexOf(arr[i]) === -1) {
      uniqueArray.push(arr[i]);
    }
  }
  return uniqueArray;
}

2. Set 数据结构

Set 是 JavaScript 中内置的数据结构,用于存储唯一值。利用 Set 的特性,我们可以轻松实现数组去重:

function removeDuplicates(arr) {
  return [...new Set(arr)];
}

3. ES6 的 Array.from()

Array.from() 方法可以将其他数据结构转换为数组。结合 Set,我们可以利用 Array.from() 实现数组去重:

function removeDuplicates(arr) {
  return Array.from(new Set(arr));
}

4. ES6 的 Array.filter()

Array.filter() 方法允许根据给定函数过滤数组元素。我们可以利用 Array.filter() 实现数组去重:

function removeDuplicates(arr) {
  return arr.filter((item, index) => arr.indexOf(item) === index);
}

5. ES6 的 Array.reduce()

Array.reduce() 方法可以将数组元素归并为单个值。利用 Array.reduce() 和 Set,我们可以实现数组去重:

function removeDuplicates(arr) {
  return arr.reduce((acc, item) => acc.add(item), new Set()).values();
}

6. ES6 的 Array.slice()

Array.slice() 方法可以复制数组的一部分。利用 Array.slice(),我们可以实现数组去重:

function removeDuplicates(arr) {
  return arr.slice().sort().filter((item, index, self) => self.indexOf(item) === index);
}

7. ES6 的 Array.prototype.unique()(提案)

Array.prototype.unique() 是 JavaScript 中一个提出的方法,可以实现数组去重:

function removeDuplicates(arr) {
  return arr.unique();
}

总结

本文介绍了七种不同的 JavaScript 数组去重算法,涵盖了从基本遍历到利用 ES6 特性的高级方法。每种算法都有其优缺点,开发者可以根据具体情况选择合适的算法。

常见问题解答

  1. 哪种算法最有效?

    • 基本遍历适用于较小的数组。对于较大的数组,Set 或 ES6 方法通常更有效。
  2. 如何处理非原始值?

    • 对于包含对象或其他复杂数据的数组,使用 Set 方法可以保证它们的唯一性,因为 Set 比较值而不是引用。
  3. 如何处理空值?

    • 所有这些算法都将 NaN 和 undefined 视为唯一值。如果需要删除空值,可以预先使用过滤函数。
  4. 能否使用第三方库?

    • 当然。Lodash 或 Underscore 等第三方库提供了方便的数组去重函数。
  5. 如何同时去重和排序?

    • 可以使用 Array.slice() 算法,它通过对数组进行排序来删除重复项。