题目示例:
已知如下数组:
var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
编写一个程序将数组扁平化并去除其中重复部分数据,最终得到一个升序且不重复的数组。
实现方法
Array.from(new Set(arr.flat(`Infinity`))).sort((a,b)=>{ return a-b})
flat()方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。flat的语法:
var newArray = arr.flat([depth])
depth指定要提取嵌套数组的结构深度,默认值为 1。
- 全局属性
Infinity是一个数值,表示无穷大。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。Array.from()方法对一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。sort()对数组的元素进行排序,并返回数组。
扩展:手写flat
此处仅列举几种简单易懂的方法:
instanceof递归实现:
function myflat1(arr){
let res = []
function bp(arr) {
let len = arr.length
for(let i = 0;i < len; i++){
if( arr[i] instanceof Array){ // 判断该元素是否为数组
let a = [...arr[i]] // 如果是数组 对其进行结构 再进行递归
bp(a)
}else{
res.push(arr[i]) // 元素不为数组时 push到res数组里
}
}
}
bp(arr)
return res
}
转字符串切割:
function myflat2(arr){
arr = arr.toString() // 将数组进行字符串转换
arr = arr.split(',') // split()方法将字符串进行分割成子字符串数组,以一个指定的分割字串来决定每个拆分的位置。
for(let i = 0,len = arr.length;i < len; i++){
arr[i] = Number(arr[i]) // 将字符串数组的元素转换成Number类型
}
return arr
}
基于Array.isArray的while循环
function myflat3(arr) {
while (arr.some(Array.isArray)) {
// Array.isArray() 用于确定传递的值是否是一个Array
//some() 方法测试数组中是不是至少有1个元素通过了被提供的函数测试
arr = [].concat(...arr)
}
return arr
}