[js面试题]简单数据类型和复杂数据类型的数组去重的几种方法

112 阅读4分钟

简单数据类型和复杂数据类型的数组去重的几种方法

简单数据类型的数组去重

1.Set去重

1.png

Set是ES6新增的一种数据类型——集合 它类似于数组 但与数组的最大的区别就是不能存储重复的元素 因此Set的一个应用场景就是数组去重

Set去重思路:

(1)第一步创建Set对象将要去重的数组放入Set对象中 此时返回的是一个Set对象 如下图所示

(2)第二步将返回的Set对象展开放入[]中再用一个变量接收就得到了一个去重后的新的数组 如下图所示

2.png

2.排序法去重

3.png

排序法思路:

(1)先将要去重的数组进行sort方法排序 方便后面相邻元素比较(此时sort方法要传参来决定是升序还是降序 如果不传参sort默认排序方法是将所有元素转化为字符串来进行比较排序从而得不到预期的排序结果)

(2)循环遍历数组来比对相邻元素是否相同 如果不相同就将比较的第一个元素存入声明的新数组 如果相同不进行操作 最后结果如下图

4.png

3.对象法去重

5.png

对象法去重核心原理就是对象中的属性名不能重复

对象法思路:

(1)声明一个空对象 循环遍历要去重的数组将元素作为对象的属性名存入对象(属性值随便写 关键是属性名)

(2)通过Object.keys遍历对象的属性名(字符串)返回一个新数组并将新数组中的属性名转化成数字类型 结果如下图

6.png

4.includes方法去重

7.png

includes方法思路:

(1)声明一个新数组 循环遍历要去重的数组 通过新数组的includes方法看是否包含当前遍历的元素 如果返回为false就说明新数组中不存在当前遍历的元素就添加进新数组 最后结果如下图

4.png

5.every方法去重

8.png

every方法思路:

(1)声明一个新数组 循环遍历要去重的数组 通过新数组的every方法看新数组中是否所有的元素都不等于当前遍历的元素 如果返回为true就说明新数组中所有元素都不等于当前遍历的元素就添加进新数组 最后结果如下图

6.some方法去重

9.png

some方法思路:

(1)声明一个新数组 循环遍历要去重的数组 通过新数组的some方法看新数组中是否有元素等于当前遍历的元素 如果返回为true就说明新数组中有元素等于当前遍历的元素就continue进行下一次循环 如果为false就说明新数组中所有元素都不等于当前遍历的元素就添加进新数组 最后结果如下图

4.png

7.indexOf方法去重

10.png

indexOf思路:

(1)声明一个新数组 循环遍历要去重的数组 通过indexOf方法看是否包含当前遍历的元素 如果返回为-1就说明新数组中不存在当前遍历的元素就添加进新数组 最后结果如下图

4.png

复杂数据类型去重

11.png

简单数据类型在栈中存的是值 复杂数据类型在栈中存的是地址 如果通过以上简单数据类型的方法来去重的话达不到去重的效果 结果如下图

12.png

这个时候就需要用到JSON来对复杂数据类型进行去重

13.png

转化为JSON格式后就没有地址可言 直接比对内容是否相同就可以达到去重的效果 结果如下图

14.png

总结:

(1)简单数据类型去重方法中Set 排序法 对象法三种方法的思路算"独立门派" 另外四种大体思路差不多 只是数组或字符串的不同方法

(2)复杂数据类型去重就要想到地址可能带来的问题

如果有问题或更多方法请指出共勉 希望对你有帮助