乐趣区

关于前端:数组去重的简单方法不含引用类型

咱们先剖析简略的场景,数组内只有根本类型,不含援用类型

首先举个栗子:

打印后果如下:

对于第一次接触这个场景的老手来说,其实这段代码很吓人。不要胆怯,接下来我带你一步一步了解这段代码的含意。

咱们要学会把简单逻辑,分多步,简单化去实现一个性能。就好比这个数组,咱们假如它只有三个 number 类型的内容。


1. 首先定义一个函数,这个函数承受一个数组作为参数

2. 先用 for 循环遍历拿到咱们数组中的每一项元素,很简略的

这时候,肯定要把这个问题简略话,不要去管前面的循环,你就只须要把 i 当成 0 就能够,那么你当初拿到了这个数组的第一个元素 1,咱们去重,那么必定就须要拿到第二个元素对吧?那第二个元素我怎么拿呢?你第一层怎么拿,那就怎么拿呗。再来一个for 不就行了吗?

ok,你当初有 12了,接下来做比拟不就行了吗?如果雷同,咱们把前面呈现的元素,也就是 j 索引对应元素删除即可。

我认为温习一下 splice 这个办法是很有必要的

splice这个办法的应用常识.

  1. 这个函数是扭转原数组的
  2. 这个函数能够接管三个参数,第一个参数为你要删除元素在数组中的索引值,第二个参数是从这个索引向后删除多少个元素,第三个参数就是在你这个索引前面减少多少个元素,这个参数是一个以逗号分隔的数据,个别很少有人晓得第三个参数,然而如果你在和他人说的时候,你晓得第三个参数,那么他人必定会对你的基本功做出一个必定的答案。
  3. . 特地重要的一点,这个函数返回值是你截取的那一部分,并不是返回原数组。(这里很多人会有一个大误区,就是我想着删除第一个元素[1,2,1],返回的应该是剩下的[2,1],然而实际上返回值是[1],咱们真正想要的后果还须要去操作原属组。)

废话不多说,咱们先抛开原题,简略试验一下 splice 这个办法

思考一:如果只有一个参数的话,那么 B 会是什么呢?

答案是:第二个参数它会默认设置为数组的长度arr.length

思考二:上面会是怎么的输入呢?

这个代码我就不放答案了,强烈建议本人去敲一敲,按 F12 在控制台打一下真的花不了你一分钟的。


回到正题

ok,咱们再来捋一下上面的代码。

乍一看如同没什么问题,运行一下试试;

什么状况?咱们不是去反复值吗?怎么还有反复的呢?咱们来一步一步剖析一下到底怎么回事:

  1. i拿着数字 1 去和上面比照,比照到 j=4,发现1===1,运行splice(4,1) 把数组开端的 1 删除,这时候原数组的值为arr=[1,2,2,2]
  2. 接下来进入第二轮循环 i 拿着 索引为 1 的数字 2 去比照拿着 j 拿着的 索引为 2 的数字 2,发现2===2 这时候运行 splice(2,1)!!!!! 留神:全篇重点来了!!!!! splice 办法运行后,arr 的长度发生变化,本来数组是 arr=[1,2,2,2],当初数组中索引为2 的元素数字 2 被删除了,而前面原来索引值为 3 的数字 2 的索引值霎时变为了 2,!!!这个索引值的变动是霎时的,留神,此时,咱们的 j 还是22 比过了吗?是的,比过了,所以 i 拿着 2 间接去找索引为 3 的数字了

这种办法咱们想到了,我应该在判断的时候,如果进到了上面的 if 语句里

那么就阐明找到了反复的值,那么咱们就让 j--,从新再让i 拿着的数字和以后的索引判断一下是否相等。


总结:咱们要通过这个例子,来捋追查重的思路,我不仅仅心愿通过这篇文章你只学会了删除 1,2,3,更重要的是你通过这个例子来买通之前未思考这个问题的思路。触类旁通,心愿你能够入手敲一敲。

退出移动版