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

yizhihongxing

我将根据您提供的问题,详细讲解如何使用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中数组去重与拍平的方法示例” 进行详细讲解。 一、去重方法 Javascript中实现数组去重有多种方法,这里介绍两种常用方法。 1. Set去重法 Set是ES6中新增的数据结构,它可以实现快速的去重操作。我们可以用Set将数组转换为一个不包含重复值的集合,最后再将集合转回数组即可。 下面是具体的示例代码: 首先,定义一个…

    JavaScript 2023年5月27日
    00
  • ES6如何将 Set 转化为数组示例详解

    当需要将ES6 Set类型转化成数组进行处理时,我们可以使用一些内置的方法来完成这个过程。 使用Array.from()方法 const mySet = new Set(["hello", "world"]); const myArr = Array.from(mySet); console.log(myArr); 在…

    JavaScript 2023年5月27日
    00
  • JavaScript 拖拽实现(附注释),最经典简单短小精悍!

    以下是JavaScript拖拽实现的详细攻略: 概述 拖拽实现是网页中常见的交互效果,它的实现原理是借助JavaScript事件和DOM操作。本文将带您全面了解JavaScript拖拽的实现方法。 基本原理 拖拽实现的基本原理如下: 给需要拖拽的元素绑定mousedown事件。 鼠标按下时,记录鼠标相对元素位置,并给document绑定mousemove和m…

    JavaScript 2023年6月11日
    00
  • Vuex的API文档说明详解

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,它通过 store 实例来管理应用中的状态,Vuex 的 API 文档说明详解包含了一系列的 API 方法及其用法。下面,我们会详细讲解Vuex的API文档说明详解的完整攻略,并提供两个示例来说明其用法。 1. Vuex 的基础概念 这部分内容主要包含了对 Vuex 的基础概念及其用法的介绍。例…

    JavaScript 2023年6月11日
    00
  • 浅谈typescript中keyof与typeof操作符用法

    当谈到TypeScript的类型系统时,我们经常听到keyof和typeof这两个操作符。这两个操作符的使用可以帮助我们更好地进行类型推断和类型检查。本文将详细讲解这两个操作符的用法以及它们在TypeScript中的常见应用。 keyof操作符 keyof操作符用于获取一个对象类型的所有键名,以联合类型的形式返回。它经常与泛型结合使用,可以在编译期进行类型检…

    JavaScript 2023年6月10日
    00
  • C#基于正则表达式实现获取网页中所有信息的网页抓取类实例

    C#基于正则表达式实现获取网页中所有信息的网页抓取类实例 1. 前言 网页抓取是实现自动化数据采集、分析和处理的重要手段之一。本篇文章将介绍使用C#基于正则表达式实现获取网页中所有信息的网页抓取类实例。 2. 实现过程 2.1 步骤一:获取网页内容 使用C#自带的HttpClient类可以很方便地获取网页的原始内容。首先,我们需要先定义一个GetHtml方法…

    JavaScript 2023年6月10日
    00
  • JS操作JSON常用方法(10w阅读)

    JS操作JSON常用方法攻略 什么是JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,其基于JavaScript语言的子集,易于人阅读和编写,同时也易于机器解析和生成。 JSON格式的数据由键值对组成,键值对之间使用英文半角逗号(,)分隔,最外层用一对大括号({})包裹,每个键值对由一个键和一个值组成,键…

    JavaScript 2023年5月27日
    00
  • Javascript的setTimeout()使用闭包特性时需要注意的问题

    下面是关于“Javascript的setTimeout()使用闭包特性时需要注意的问题”的详细讲解。 什么是setTimeout() setTimeout() 是 JavaScript 语言自带的一个定时器,通常用于在指定的时间间隔之后执行一段指定的代码。setTimeout() 函数的语法如下: setTimeout(func|code, delay); …

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