美文网首页
数组去重

数组去重

作者: Max_Law | 来源:发表于2024-01-09 11:36 被阅读0次

在编程中,我们经常会遇到需要去除数组中重复元素的问题。无论是笔试题还是实际项目中,掌握有效的数组去重方法都是非常重要的。本文将详细介绍在 ES5 和 ES6 中处理数组去重的几种常见方法,并分析其优缺点。

ES5 中的数组去重方法

嵌套循环去重

这是一种基于比较的去重方法。通过使用两层循环,我们将数组中的每个元素与它后面的元素进行比较。如果发现两个元素相等,就使用 splice 方法删除重复的元素。

function unique(array) {
  for (var i = 0; i < array.length; i++) {
    for (var j = i + 1; j < array.length; j++) {
      if (array[i] === array[j]) {
        array.splice(j, 1);
        j--;
      }
    }
  }
  return array;
}

然而,这种方法的缺点是效率较低,尤其是在处理大型数组时。此外,由于使用的是全等(===)比较,所以无法去除 NaN 和空对象 {}

indexOf 检查去重

这种方法通过新建一个空数组,然后遍历原数组,对于原数组中的每个元素,检查它是否已经在新数组中存在。如果不存在,就将其添加到新数组中。

function unique(array) {
  var arr = [],
    tag;
  for (var index = 0; index < array.length; index++) {
    tag = array[index];
    if (!~arr.indexOf(tag)) {
      arr.push(tag);
    }
  }
  return arr;
}

这种方法的性能优于嵌套循环去重,但同样无法处理 NaN 和空对象 {} 的去重问题。

ES6 中的数组去重方法

使用 Set 去重

ES6 引入了新的数据结构 Set,它的特点是所有元素都是唯一的,没有重复值。因此,我们可以利用 Set 来轻松地去除数组中的重复元素。

function unique(array) {
  return Array.from(new Set(array));
}

这种方法简洁且高效,但对于不支持 Set 的环境则无法使用。

使用扩展运算符和 Set 结合去重

这种方法首先将数组转换为 Set,然后再将 Set 转换回数组。使用扩展运算符可以简化这个过程。

function unique(array) {
  return [...new Set(array)];
}

这种方法的优点是代码简洁,但同样依赖于 Set 数据结构。

使用 filter 方法去重

这种方法利用了 JavaScript 的 filter 方法和 indexOf 方法。对于数组中的每个元素,如果它在原数组中第一次出现的位置就是它自身的位置,那么这个元素就是唯一的,将其保留。

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

这种方法在不支持 Set 的环境中仍然可用,但性能可能略低于使用 Set 的方法。

常用去重函数

以下是一个基于对象键名特性进行去重的普遍常用函数,这种方法在 ES5 及以上版本中都可以使用:

function unique(array) {
  var obj = {};
  return array.filter(function (item) {
    return obj.hasOwnProperty.call(obj, item) ? false : (obj[item] = true);
  });
}

这个函数的工作原理是利用 JavaScript 对象的键名特性,即对象的键名必须是唯一的。我们创建一个空对象 obj,然后遍历数组 array。对于数组中的每个元素,我们尝试将其作为键添加到对象 obj 中。如果该键已经存在(即元素已经出现过),obj.hasOwnProperty.call(obj, item) 返回 true,过滤函数返回 false,该元素将被过滤掉。如果该键不存在,我们就将其添加到对象中,并返回 true,该元素将被保留。

这种方法的优点是兼容性好,且可以处理 NaN 和空对象 {} 的去重问题。但是,由于涉及到对象属性的查找和设置,对于非常大的数组,性能可能会略低于使用 Set 的方法。此外,需要注意的是,这种方法会改变原始数组元素的顺序,如果需要保持原序,可以结合其他方法或者对结果进行排序。

相关文章

  • 数组的去重和数组中对象的去重

    数组中对象去重 方式1 jq方式 方式2 原生js方式 普通数组的去重 方式1 普通的数组去重js 方式2 Se...

  • js数组去重、对象数组去重

    普通数组去重 一、普通数组去重 方法一:遍历数组法 方法二:排序法 方法三:对象法 对象数组去重 方法一:将对象数...

  • js数组去重

    Set结构去重 ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。 向 Se...

  • JS数组去重

    方法1:两层for循环,外层循环原数组,内层循环时进行比较。 方法2:利用对象的属性不能相同的特点去重 方法3:利...

  • js数组去重

  • js数组去重

    1.利用对象的属性唯一性去重 2.利用es6的Set

  • js数组去重

  • js 数组去重

  • JS数组去重

    方法一:遍历数组,建立新数组,利用indexOf判断是否存在于新数组中,不存在则push到新数组,最后返回新数组 ...

  • js数组去重

    方法一 (es6 set方法,简单粗暴) 方法二 创建空数组,用indexOf方法检索,没有的话插入新数组中 方...

网友评论

      本文标题: 数组去重

      本文链接:https://www.haomeiwen.com/subject/equmnctx.html