需求:遍历出树的所有同级节点,并返回一个二维数组(原始树与新生成的二维数组如下)
解决方法1:(使用中间过渡数组)
const formatArrA = arr => {
let initArr = []
let curChildren = []
const format = (ar, i) => {
initArr[i] || (initArr[i] = [])
curChildren = [] // 每次循环重新清空curChildren
ar.forEach(val => {
initArr[i].push(val)
if (Array.isArray(val.children) && val.children.length > 0) {
curChildren = [...curChildren, ...val.children]
}
})
if (curChildren.length > 0) {
format(curChildren, i + 1)
}
return initArr
}
return format(arr, 0)
}
解决方法2:
const formatArrB = arr => {
let initArr = []
const format = (ar, i) => {
initArr[i] || (initArr[i] = [])
ar.forEach(val => {
initArr[i].push(val)
if (Array.isArray(val.children) && val.children.length > 0) {
format(val.children, i + 1) // 此处不能用i++或者++i,因为循环可能还未完成
}
})
return initArr
}
return format(arr, 0)
}
解决方法3:(使用reduce)
const formatArrC = arr => {
let initArr = []
const format = (ar, i) => {
initArr[i] || (initArr[i] = [])
ar.reduce((acc, cur) => {
acc[i].push(cur)
if (Array.isArray(cur.children) && cur.children.length > 0) {
format(cur.children, i + 1) // 此处不能用i++或者++i,因为循环可能还未完成
}
return acc
}, initArr)
return initArr
}
return format(arr, 0)
}