JavaScript关于数组去重

总结一下关于js数组去重的思路

说到去重,我脑海中的第一想法是采用最基础的双层嵌套循环,大致思路是创建一个新数组,这个新数组就是最终去重后的数组。
法一 我们可以先对老数组进行遍历,这是外层for循环。拿老数组的每一项与新数组的第一项到最后一项作比较,而新数组的第一项到最后一项就是内层for循环。
如果老数组的某项与新数组的每一项都不相同,就把老数组的这项添加到新数组中;否则就中断内层循环,跳到外层循环继续老数组的下一项进行遍历。
基础代码如下:
在这里插入图片描述
在这里插入图片描述
并没有达到预期效果,因为break语句是跳出本层循环,继续执行循环后的语句。本例中,当条件满足时跳出内层for循环后还是会执行push语句。那么现在的问题就成了,在双层循环中如何跳出内部循环,直接进行外层循环。这个问题的思路有三种。第一,采用标签语句。第二,将内层循环封装成一个函数,直接return。第三,创建一个标志位。

法一思路1

采用标签语句
标签语句label通常会与for语句等循环语句配合使用。在外层for循环前写上标签名,内部循环的if语句中如果条件成立,那么直接break到外层循环。代码如下:
在这里插入图片描述

法一思路2

封装成函数
函数内部如果遇到return语句,则直接跳出函数,不会执行return后面的语句。代码如下:
在这里插入图片描述

法一思路3

创建标志位
创建一个标志位,用来判断当前值是否加到新数组中。代码如下:
在这里插入图片描述
法二 上面的方法是创建新数组。我们也可以在原来的数组上操作,拿数组的某项和它之后的项进行比较,如果重复就把重复项删除,这里用到数组删除的方法splice。代码如下:
在这里插入图片描述
在这里插入图片描述
或者先对数组排序,然后循环某项与它之后的一项作比较,重复则删。

法三 对象的各个属性名是不能重复的,我们可以借助对象的这个特点来实现数组去重。代码如下:
在这里插入图片描述
在这里插入图片描述
但这个方法对于数组项为不同数据类型的情况不适用,比方说数组为arr=[1,’1’,1],最终去重后的结果是[1]。并且这个方法和以上所有方法对于数组项是对象的数组不适用。

以上这些方法对于ES3就可以使用(除let)。我们也可以直接采用ES5新增的 indexOf() 位置方法来判断某个数组项是否存在以及ES5的迭代方法如 forEach() 来代替for循环。以上方法对于数组项是对象的不适用,因为对象的比较是内存地址值的比较,每个独立对象都不相等,就算是 indexOf() 对于数组项是对象的数组也不能有效判断,因为其本质也还是对两个值进行全等判断。后续方法将持续更新。

法四 ES6的Set对象。类似于数组,但每个成员都是唯一的,没有重复。代码如下:
在这里插入图片描述
或者

在这里插入图片描述
或者

在这里插入图片描述

set这个方法对于数组项是对象的也不适用,set内部对于比较也是全等匹配,对于对象也认为两个独立的对象总不相等。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值