广告
返回顶部
首页 > 资讯 > 精选 >JavaScript怎么实现数组去重
  • 936
分享到

JavaScript怎么实现数组去重

2023-06-06 16:06:38 936人浏览 泡泡鱼
摘要

这篇“javascript怎么实现数组去重”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“JavaScript怎么实现数组去重”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢理解,接

这篇“javascript怎么实现数组去重”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“JavaScript怎么实现数组去重”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢理解,接下来就让我们进入主题吧。

JavaScript的特点

1.JavaScript主要用来向html页面添加交互行为。2.JavaScript可以直接嵌入到HTML页面,但写成单独的js文件有利于结构和行为的分离。3.JavaScript具有跨平台特性,在绝大多数浏览器的支持下,可以在多种平台下运行。

一、双层循环

const unique = (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;};const unique = (arr)=>{    var arr = [1, '1', '1', 1, 2, true, false, true, 3, 2, 2, 1];    var newArr = [];    for(let i = 0; i < arr.length; i++){        for(var j = 0; j < newArr.length; j++){ // 注意var声明的j            if(arr[i] === newArr[j]) break; // 新数组已存在当前值        }        if(j === newArr.length){ // 此时j和newArr长度相等,没有被中断            newArr.push(arr[i]);        }    }    return newArr;}unique([1, '1', '1', 1, 2, true, false, true, 3, 2, 2, 1]); // [ 1, '1', 2, true, false, 3 ]

核心点:

  • 时间复杂度:O(n^2)

  • 上面的两种方法都是两次循环遍历,处理方式略有不同

  • 上述实现方式确实不是最佳选择,但它胜在兼容性好啊~

二、indexOf和includes

2.1 indexOf简化一层循环判断

核心点:

  • 如果需要返回原数组,则可以在indexOf方法找到重复项时(不等于它首次出现的位置)时利用splice移除

  • indexOf:返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。

  • indexOf(ele, fromIndex)

    • ele:要查找的元素

    • fromIndex:查找元素的起始位置,默认为0,允许负数,-2表示从倒数第二个元素开始查找

    • 返回一个下标(number)

代码:

const unique = (arr) => {    var res = [];    for (let i = 0; i < arr.length; i++){        if(res.indexOf(arr[i]) === -1 ){            res.push(arr[i]);        }    }    return res;}
2.2 includes简化一层循环判断

核心点:

  • 具体的是要返回原数组还是新数组大家可以自行组合~

  • includes:用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回false

  • includes(ele, fromIndex)

    • ele:要查找的元素

    • fromIndex:指定索引处开始查找。默认为 0,如果为负值,从末尾开始往前跳 fromIndex 的绝对值个索引。。

    • 返回结果(bool)

代码:

const unique = (arr) => {    var res = [];    for (let i = 0; i < arr.length; i++){        if(!res.includes(arr[i])){            res.push(arr[i]);        }    }    return res;}
2.3 indexOf和includes对于当前场景的选择

在这里我们推荐使用includes来查找元素:

返回值可以直接作为if的条件语句,简洁

if(res.indexOf(arr[i]) !== -1 ){ todo }// orif(res.includes(arr[i])){ todo }

识别NaN

如果数组中有NaN,你又正好需要判断数组是否有存在NaN,这时你使用indexOf是无法判断的,你必须使用includes这个方法。

var arr = [NaN, NaN];arr.indexOf(NaN); // -1arr.includes(NaN); // true

识别undefined

如果数组中有undefined值,includes会认为空的值是undefined,而indexOf不会。

var arr = new Array(3);console.log(arr.indexOf(undefined)); //-1console.log(arr.includes(undefined)) //true

三、排序去重

核心点:

  • 数组排序后,相同的元素会相邻,所以如果当前元素与它的相邻元素不同,就存入到新数组中;

  • 相比于indexOf,只需要一层循环;

  • concat会拼接数组,并返回新数组;

  • sort()排序是通过按照转换为的字符串的各个字符的Unicode位点进行排序。所以很难保证它的准确性;

代码:

var arr = [1, 1, '1'];function unique(arr) {    var res = [];    var sortedArr = arr.concat().sort();    var last;    for (var i = 0; i < sortedArr.length ; i++) {        // 如果是第一个元素或者相邻的元素不相同        if (!i || last !== sortedArr[i]) {            res.push(sortedArr[i])        }        last = sortedArr[i]; // 记录上一个值    }    return res;}console.log(unique(array));

四、filter

核心点:

  • filter:方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素(返回测试函数成立的元素)

  • filter(callback, thisArg)

    • callback接受三个参数:element-当前正在处理的元素,index-当前元素索引,array-调用了filter的数组本身

    • thisArg:执行 callback 时,用于 this 的值。
      利用filter我们可以在代码层面简化一下外层循环:

代码:

var arr = [1, 2, 1, 1, '1'];const unique = function (arr) {    var res = arr.filter(function(item, index, arr){        return arr.indexOf(item) === index;    })    return res;}console.log(unique(arr)); // [ 1, 2, '1' ]

结合排序的思路:

var arr = [1, 2, 1, 1, '1'];const unique = function (arr) {    return arr.concat().sort().filter(function(item, index, arr){        return !index || item !== arr[index - 1]    })}console.log(unique(arr));

五、键值对(key-value)

前面提到的几种方式总结下来大致分为

  1. 非排序数组,两次遍历判断(遍历、查询)

  2. 排序数组,相邻元素比较

我们再提出一种方式,利用Object对象 key-value的方式,来统计数组中元素出现的个数,初步判断逻辑也有两种

[1,1,1,2,2,3,'3']举例:

  1. 统计每个元素出现的次数,obj:{1: 3, 2: 2, 3: 3}, 返回这个objkey而不管他们的value

  2. 只元素首次出现,再次出现则证明他是重复元素

5.1 统计次数
var arr = [1, 2, 1, 1, '1', 3, 3];const unique = function(arr) {    var obj = {};    var res = [];    arr.forEach(item => {        if (!obj[item]) {            obj[item] = true;            res.push(item);        }    });    return res;}console.log(unique(arr)); // [1, 2, 3]
5.2 结合filter
var arr = [1, 2, 1, 1, '1'];const unique = function(arr) {    var obj = {};    return arr.filter(function(item, index, arr){        return obj.hasOwnProperty(item) ? false : (obj[item] = true)    })}console.log(unique(arr)); // [1, 2]
5.3 key: value存在的问题

对象的属性是字符串类型的,即本身数字1字符串‘1’是不同的,但保存到对象中时会发生隐式类型转换,导致去重存在一定的隐患。

考虑到string和number的区别(typeof 1 === ‘number’, typeof ‘1’ === ‘string’),

所以我们可以使用 typeof item + item 拼成字符串作为 key 值来避免这个问题:

var arr = [1, 2, 1, 1, '1', 3, 3, '2'];const unique = function(arr) {    var obj = {};    var res = [];    arr.forEach(item => {        if (!obj[typeof item + item]) {            obj[typeof item + item] = true;            res.push(item);        }    });    return res;}console.log(unique(arr)); // [ 1, 2, '1', 3, '2' ]

六、ES6

随着 es6 的到来,去重的方法又有了进展,比如我们可以使用 Set 和 Map 数据结构

6.1 Set

Set:它允许你存储任何类型的唯一值,无论是原始值或者是对象引用

代码:

var arr = [1, 2, 1, '1', '2'];const unique = function(arr) {   return Array.from(new Set(arr));}console.log(unique(arr)); // [ 1, 2, '1', '2' ]

简化1:

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

简化2:

var unique = (a) => [...new Set(a)]
6.2 Map

Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。

  • Map.prototype.has(key):返回一个布尔值,表示Map实例是否包含键对应的值。

  • Map.prototype.set(key, value):设置Map对象中键的值。返回该Map对象。

function unique (arr) {    const newMap = new Map()    return arr.filter((a) => !newMap.has(a) && newMap.set(a, 1));}

写到这里比较常规的数组去重方法就总结的差不多了,如果需要更强大的去重方法,我们需要对他们进行组合,而且因为场景的不同,我们所实现的方法并不一定能涵盖到

以上是“JavaScript怎么实现数组去重”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: JavaScript怎么实现数组去重

本文链接: https://www.lsjlt.com/news/247946.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript怎么实现数组去重
    这篇“JavaScript怎么实现数组去重”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“JavaScript怎么实现数组去重”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢理解,接...
    99+
    2023-06-06
  • JavaScript中怎么实现数组去重
    这篇文章主要介绍了JavaScript中怎么实现数组去重,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:数组去重,一般都是在面试的时...
    99+
    2022-10-19
  • Javascript怎样实现数组去重
    这篇文章将为大家详细讲解有关Javascript怎样实现数组去重,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。数组去重1、from()叠加new Set()方法字符串或数值型数组的去重可以直接使用from...
    99+
    2023-06-17
  • javascript数组去重如何实现
    这篇文章主要为大家展示了“javascript数组去重如何实现”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript数组去重如何实现”这篇文章吧。 ...
    99+
    2022-10-19
  • php怎么实现数组去重
    本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php 数组元素快速去重1.使用array_unique方法进行去重对数组元素进行去重,我们一般会使用array_unique方法,使用这个方法可以把数组中的元素去重。&...
    99+
    2019-10-11
    php
  • js数组去重怎么实现
    这篇文章主要介绍“js数组去重怎么实现”,在日常操作中,相信很多人在js数组去重怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”js数组去重怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!方法...
    99+
    2023-07-02
  • javascript数组怎么快速去重
    这篇“javascript数组怎么快速去重”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“javascript数组怎么快速去重...
    99+
    2023-07-06
  • 使用JavaScript怎么对数组去重
    使用JavaScript怎么对数组去重?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。js数组去重方法:1、遍历数组法;2、数组下标判断法;3、排序后相邻去除法;4、优化的遍历数...
    99+
    2023-06-14
  • es5和es6怎么实现数组去重
    本教程操作环境:windows7系统、ECMAScript 6版、Dell G3电脑。es5 数组去重indexOf 方法使用indexOf(可返回某个指定的字符串值在字符串中首次出现的位置,如果首次出现,返回-1) var arr = [...
    99+
    2023-05-14
    es5 ES6 数组去重
  • JavaScript实现数组去重的7种方法
    目录前言方法实现双循环去重indexOf方法去重1indexOf方法去重2相邻元素去重利用对象属性去重set与解构赋值去重Array.from与set去重总结前言 去重是开发中经常会...
    99+
    2022-11-13
  • JavaScript如何利用hasOwnProperty实现数组去重
    这篇文章主要介绍JavaScript如何利用hasOwnProperty实现数组去重,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!利用hasOwnPropertyfunction unique(arr)&n...
    99+
    2023-06-17
  • JavaScript如何利用includes实现数组去重
    这篇文章主要为大家展示了“JavaScript如何利用includes实现数组去重”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript如何利用includes实现数组去重”这篇文章...
    99+
    2023-06-03
  • 怎么在JavaScript中对象数组去重
    怎么在JavaScript中对象数组去重?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。JavaScript有什么特点1、js属于一种解释性脚本语言;2、在绝大多数浏览器的支...
    99+
    2023-06-14
  • JavaScript 中怎么实现数组去重并统计重复元素出现的次数
    这篇文章将为大家详细讲解有关JavaScript 中怎么实现数组去重并统计重复元素出现的次数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、方法一var&...
    99+
    2022-10-19
  • php不用函数怎么实现数组去重
    实现步骤:1、定义2个空数组,用于存储两次反转的键和值;2、用foreach语句遍历原数组,将原数组键和值赋给一个空数组作值和键,语法“foreach($arr as $k1=>$v1){$r1[$v1]=$k1;}”;3、用fore...
    99+
    2022-09-21
  • JavaScript 数组去重详解
    目录1.数组去重2.数组去重里面的对象去重3.根据数组某个字段相同,修改另外字段值总结1.数组去重 var obj = ['麒麟','社','CC'...
    99+
    2022-11-12
  • JavaScript数组去重方案
    目录方法一:set :不是一种数据类型,是一种数据结构;成员唯一方法二:对象属性名不能重复方法三:indexOf方法四:sort方法五:includes :包含;如果数组包含那一项,...
    99+
    2022-11-12
  • JavaScript数组如何去重
    本文小编为大家详细介绍“JavaScript数组如何去重”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript数组如何去重”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识...
    99+
    2022-10-19
  • golang怎么利用map实现数组去重
    这篇文章主要讲解了“golang怎么利用map实现数组去重”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“golang怎么利用map实现数组去重”吧!golang数组去重利用map可以利用go...
    99+
    2023-06-30
  • JavaScript中实现数组去重有哪些方法
    小编给大家分享一下JavaScript中实现数组去重有哪些方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!数组去重const arr = [1, ...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作