数组扁平化
数组扁平化也叫数组降维、数组扯平。
实现数组扯平的方法:
- Array.prototype.falt()
用于将嵌套的数组拉平,变成一维数组。该方法是ES6中的,返回一个新的数组,对原数据没有影响。flat()默认只会扯平一层,若要处理多层的嵌套数组,可以将flat()方法的参数写成一个整数;若无论多少层都要转为一维数组,可以使用Infinity关键字作为参数,若有空位则会跳过。
const arr = [1,2,3,[1,2,3,4,5],6,'name',{key:10}]
let result = arr.flat(Infinity)
console.log(result) // [1, 2, 3, 1, 2, 3, 4, 5, 6, "name", {…}]
- 普通递归思路
遍历传入的数组,利用Array.isArray()方法判断传入的每一项是否为数组,若为数组则继续遍历,若不是则添加到新数组中。
const arr = [1,2,3,[1,2,3,4,5],6,'name',{key:10}]
function flat(arr){
let result = []
arr.forEach(item=>{
if(Array.isArray(item)){
result = result.concat(flat(item))
}else{
result.push(item)
}
})
return result
}
- 使用高阶函数reduce实现
reduce:迭代循环器,通常用于累加
const arr = [1,2,3,[1,2,3,4,5],6,'name',{key:10}]
function flat(arr){
return arr.reduce((pre,cur)=>{
return pre.concat(Array.isArray(cur) ? flat(cur) : cur)
},[])
}
- 使用栈实现
const arr = [1,2,3,[1,2,3,4,5],6,'name',{key:10}]
function flat(arr){
let result = []
let stack = []
stack = [].concat(arr)
if(stack.length!=0){
let cur = stack.pop();
if(Array.isArray(cur)){
stack.push(...cur)
}else{
result .unshift(cur)
}
return result
}
- 使用队列实现
const arr = [1,2,3,[1,2,3,4,5],6,'name',{key:10}]
function flat(arr){
let result = []
while(true){
if(arr.length===0) break
let cur = arr.shift();
if(Array.isArray(cur)){
arr.unshift(cur)
}else{
result.push(cur)
}
}
return result
}
跑步的时候我脑子里想的是数组扯平,终于想通了…