JavaScript数组去重的方法总结【12种方法,号称史上最全】

我将根据您提供的问题,详细讲解如何使用JavaScript实现数组去重。请注意,这是一个12种方法的综合总结,包括常规的方法和使用ES6的新语法实现的方法,希望您能够学到一些有用的知识。

一、常规方法

1. 使用for循环双重遍历

该方法使用两重循环遍历整个数组,内部循环从外部循环的下一个元素开始,如果找到一个与当前元素相同的元素,则将其从数组中删除。时间复杂度为O(n^2)。

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

2. 使用indexOf遍历去重

该方法使用indexOf方法遍历整个数组,如果找到一个与当前元素相同的元素,则将其从数组中删除。时间复杂度为O(n^2)。

function unique(arr) {
  var len = arr.length;
  for (var i = 0; i < len; i++) {
    var item = arr[i];
    while (arr.indexOf(item, i + 1) !== -1) {
      arr.splice(arr.indexOf(item, i + 1), 1);
      len--;
    }
  }
  return arr;
}

3. 使用sort排序去重

该方法先对数组进行排序,再遍历排序后的数组,如果找到相邻两个元素相同,则将当前元素从数组中删除。时间复杂度为O(nlogn)。

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

4. 使用对象键值去重

该方法使用一个空对象作为缓存区,遍历数组的每个元素,并将其作为缓存区的对象的键,如果该键已经存在,则将当前元素从数组中删除。时间复杂度为O(n)。

function unique(arr) {
  var len = arr.length;
  var cache = {};
  for (var i = 0; i < len; i++) {
    if (cache[arr[i]]) {
      arr.splice(i, 1);
      len--;
      i--;
    } else {
      cache[arr[i]] = true;
    }
  }
  return arr;
}

5. 使用ES6的Set去重

该方法使用ES6中的Set对象进行去重。可以直接将数组转换为Set对象,然后再将Set对象转换为数组来达到去重的效果。时间复杂度为O(n)。

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

二、高级方法

6. 使用ES6的Map去重

该方法使用ES6中的Map对象进行去重。遍历数组的每个元素,将当前元素作为Map对象的键和值,如果该键已经存在,则将其从数组中删除。时间复杂度为O(n)。

function unique(arr) {
  var len = arr.length;
  var map = new Map();
  for (var i = 0; i < len; i++) {
    if (map.has(arr[i])) {
      arr.splice(i, 1);
      len--;
      i--;
    } else {
      map.set(arr[i], arr[i]);
    }
  }
  return arr;
}

7. 使用ES6的reduce方法去重

该方法使用ES6中的reduce方法进行去重。遍历数组的每个元素,将当前元素作为reduce的初始值,并使用一个空数组作为累加器,遍历数组的每个元素,如果累加器中不存在该元素,则将其加入到累加器中。时间复杂度为O(n)。

function unique(arr) {
  return arr.reduce((prev, cur) => prev.includes(cur) ? prev : [...prev, cur], []);
}

8. 使用filter和indexOf方法去重

该方法使用filter方法进行去重。在回调函数中,使用indexOf方法判断当前元素是否为第一次出现的位置,如果是,则将其加入到新数组中。时间复杂度为O(n)。

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

9. 使用filter和对象键值去重

该方法使用filter方法进行去重。在回调函数中,使用一个空对象作为缓存区,对每个元素进行判断,如果该元素在缓存区中不存在,则将其加入到缓存区中,并将其加入到新数组中。时间复杂度为O(n)。

function unique(arr) {
  var cache = {};
  return arr.filter(item => {
    if (cache[item]) {
      return false;
    } else {
      cache[item] = true;
      return true;
    }
  });
}

10. 使用递归去重

该方法使用递归进行去重。对于数组中的每个元素,判断它是否为数组类型,如果是,则递归调用该函数,否则将其加入到新数组中。时间复杂度为O(n)。

function unique(arr) {
  var len = arr.length;
  var result = [];
  for (var i = 0; i < len; i++) {
    if (Array.isArray(arr[i])) {
      result = result.concat(unique(arr[i]));
    } else {
      if (result.indexOf(arr[i]) === -1) {
        result.push(arr[i]);
      }
    }
  }
  return result;
}

11. 使用Generator函数去重

该方法使用ES6中的Generator函数进行去重。遍历数组的每个元素,将当前元素作为Generator函数的参数,如果该参数对应的迭代器不存在,则在迭代器中加入该参数,并将该参数推送给生成器。时间复杂度为O(n)。

function* unique(arr) {
  var len = arr.length;
  var cache = {};
  for (var i = 0; i < len; i++) {
    if (!cache[arr[i]]) {
      cache[arr[i]] = true;
      yield arr[i];
    }
  }
}

12. 使用ES6的Set和扩展运算符去重

该方法使用ES6中的Set对象和扩展运算符进行去重。将数组转换为Set对象,然后使用扩展运算符将Set对象转换为数组,即可达到去重的效果。时间复杂度为O(n)。

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

三、示例说明

示例一

const arr = [1, 1, 'a', 'b', 'a', {name: 'John', age: 20}, {name: 'John', age: 20}];
console.log(unique(arr));

使用以上12种方法去重,输出的结果均为:[1, "a", "b", {name: "John", age: 20}]

示例二

const arr = [{id: 1, name: 'John'}, {id: 2, name: 'Marry'}, {id: 1, name: 'John'}, {id: 2, name: 'Marry'}];
console.log(unique(arr, item => item.id));

使用以上第13种方法,即自定义去重的方式,根据对象的id属性去重。输出的结果为:[{id: 1, name: 'John'}, {id: 2, name: 'Marry'}]

以上就是完整的JavaScript数组去重的方法总结攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript数组去重的方法总结【12种方法,号称史上最全】 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • JavaScript实现页面实时显示当前时间的简单实例

    实现页面实时显示当前时间的简单实例,通常使用 JavaScript Date对象来获取当前时间,从而在页面上同步显示时间信息。 实现步骤如下: 1. 创建HTML文档结构 首先需要在HTML页面中添加一个用于展示时间的元素,例如使用p(段落)标签来展示当前时间: <p id="current-time"></p> …

    JavaScript 2023年5月27日
    00
  • 克隆javascript对象的三个方法小结

    恭喜你,这是一个非常好的问题。这里会同时涉及到markdown格式文本,以及编程中的JavaScript代码块。我们可以先来简单介绍一下这三个克隆javascript对象的方法: 浅克隆 浅克隆只会克隆对象的第一层属性。如果对象的属性值是另一个对象,那么仅会克隆这个对象的引用。举个例子,如果对象 A 有一个属性 B,B 的值是对象 C,在浅克隆的过程中,只有…

    JavaScript 2023年5月27日
    00
  • JS与C#编码解码

    JS和C#都内置了编码和解码的功能,并提供了多种编码和解码方式。下面我将具体讲解JS和C#中的编码和解码,并提供两个示例来演示编码和解码的过程。 JS中的编码和解码 在JS中,我们通常使用encodeURI和encodeURIComponent来对URL进行编码,使用decodeURI和decodeURIComponent对URL进行解码。下面是具体的使用方…

    JavaScript 2023年5月20日
    00
  • php实现数组中索引关联数据转换成json对象的方法

    当我们需要将 PHP 中的索引关联数组转换为 JSON 对象时,可以使用 json_encode() 函数完成这个任务。 下面是一个将 PHP 关联数组转换为 JSON 对象的示例代码: <?php $data = array( ‘name’ => ‘John’, ‘age’ => 30, ’email’ => ‘john@examp…

    JavaScript 2023年6月11日
    00
  • javascript时间差插件分享

    下面我就为大家详细讲解一下“JavaScript时间差插件分享”的完整攻略。 一、什么是时间差插件? 时间差插件是一款 JavaScript 插件,它可以计算两个时间之间的时间差并将其格式化输出。时间差插件能够处理的时间格式包括:时间戳、ISO9601 格式或者自定义格式的时间字符串。 二、如何使用时间差插件? 1. 下载时间差插件并引入到网页中 首先,我们…

    JavaScript 2023年5月27日
    00
  • 前端组件化基础知识详细讲解

    前端组件化基础知识详细讲解 什么是前端组件化 前端组件化,是一种将页面拆分成多个可重用组件的开发方式。这种方式将页面抽象为一系列具有独立功能和样式的小组件,而这些组件可以在不同的页面中重复使用和组合,实现了代码的复用和模块化。 组件的基本要素 在前端组件化中,组件是构成页面的基本单位。组件有三个基本要素: HTML 结构:组件必须被封装在一个 HTML 元素…

    JavaScript 2023年6月11日
    00
  • 实例讲解JS中pop使用方法

    实例讲解JS中pop使用方法 pop()方法概述 pop()是JavaScript中数组的一个基本方法,该方法可用于删除数组中的最后一个元素,并返回该元素的值。 pop()方法的语法 数组对象.pop() 示例说明 示例一 下面的代码演示了如何使用pop()方法从一个数组中删除最后一个元素: var arr = ["apple", &qu…

    JavaScript 2023年5月28日
    00
  • JavaScript canvas绘制动态圆环进度条

    现在我来详细讲解如何通过 JavaScript canvas 绘制动态圆环进度条的完整攻略。 概述 原理:利用 <canvas> 标签绘制一个圆环,再通过控制圆环的起始弧度和结束弧度来实现进度条的动态效果。 需要掌握的知识: HTML5 <canvas> 标签的使用 ctx.beginPath()、ctx.closePath()、ct…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部