返回

数组去重的快刀斩乱麻法,详解几种主流方法的奥秘

前端

方案一:数组双循环比较

这种方法非常简单,通过双重循环来比较数组中的每个元素,如果找到重复元素,则将其删除。这种方法虽然易于理解,但性能非常差,尤其是当数组很大时。

function removeDuplicates1(arr) {
  for (let i = 0; i < arr.length; i++) {
    for (let j = i + 1; j < arr.length; j++) {
      if (arr[i] === arr[j]) {
        arr.splice(j, 1);
        j--;
      }
    }
  }

  return arr;
}

方案二:基于对象键值对方式去重

这种方法利用了对象属性名不能重复的特性,将数组元素作为对象的键值对,然后通过对象的键值对来去除重复元素。这种方法的性能要比双循环比较法好得多,但缺点是需要创建一个临时对象,可能会占用更多的内存。

function removeDuplicates2(arr) {
  const obj = {};
  const result = [];

  for (let i = 0; i < arr.length; i++) {
    if (!obj[arr[i]]) {
      obj[arr[i]] = true;
      result.push(arr[i]);
    }
  }

  return result;
}

方案三:利用Set数据结构去重

Set数据结构是一种无序的、不重复的元素集合。我们可以将数组元素添加到Set中,然后将其转换为数组。这种方法的性能非常优秀,而且代码也非常简洁。

function removeDuplicates3(arr) {
  const set = new Set(arr);
  return Array.from(set);
}

方案四:利用Array.prototype.filter()方法去重

Array.prototype.filter()方法可以过滤数组中的元素,返回一个新的数组,其中包含通过指定条件的所有元素。我们可以使用filter()方法来过滤重复元素。

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

优缺点总结

方法 优点 缺点
双循环比较 简单易懂 性能差,尤其是当数组很大时
基于对象键值对方式去重 性能较好 需要创建一个临时对象,可能会占用更多的内存
利用Set数据结构去重 性能优秀,代码简洁 不能保证元素的顺序
利用Array.prototype.filter()方法去重 性能较好,代码简洁 不能保证元素的顺序

总结

以上四种数组去重方法各有优缺点,在实际应用中,我们可以根据自己的需求选择最合适的方法。如果数组很大,则可以使用Set数据结构去重方法或者利用Array.prototype.filter()方法去重。如果数组较小,则可以使用双循环比较法或者基于对象键值对方式去重。