更多数组去重方法,请查看 多种姿势 数组去重
先来定义一组数据,深度为6层
let arr = [1,2,9,[3,1,4,[5,3,6,[7,8,[9,[10]]]]]]
关于 数组扁平化并去除其中重复数据,且得到一个升序且不重复的数组,可先将思路理清晰。
方法一
步骤可分解如下:
- 扁平化。将多层次数组的数据整合到一个数组内
- 去重。得到不重复的数据
- 排序。按照既定规则排序
既然步骤划分好,就可一步步实现了。
1.数组扁平化
知识点:flat()
flat()
方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。
- 使用
Infinity
,可展开任意深度的嵌套数组
将上述数据进行扁平化处理:
let arrFlat = arr.flat(Infinity)
// [1, 2, 9, 3, 1, 4, 5, 3, 6, 7, 8, 9, 10]
2.数组去重
知识点: new Set()
new Set()
Set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。
将上述数据进行去重处理:
let noRepeat = Array.from(new Set(arrFlat))
// [1, 2, 9, 3, 4, 5, 6, 7, 8, 10]
因为new Set()
之后的数据不是真正的数组,所以需要Array.from()
进行转换
3.排序
知识点:sort()
将上述数据进行排序处理:
let sortArr = noRepeat.sort((a,b)=>{return a-b})
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
将上述操作简写如下:
let arr = [1,2,9,[3,1,4,[5,3,6,[7,8,[9,[10]]]]]]
let resArr = Array.from(new Set(arr.flat(Infinity))).sort((a,b)=>{return a-b})
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
方法二
步骤分解
- 将多维数组转换成字符串
- 将字符串转换成一维数组
- 将数组的元素转换成Number并排序
- 去重
let arr = [1,2,9,[3,1,4,[5,3,6,[7,8,[9,[10]]]]]]
let resArr = Array.from(new Set(arr.toString().split(',').map(Number).sort((a,b)=>{return a-b})))