阿里 字节 腾讯笔面试题:
[
["a", "aa", "aaa", "aaaa"],
["b", "bb", "bbb"],
["a", "ab", "aba"],
["a", "aa", "aab"]
]
转化为
[
{
"name" : "a",
"child" : [
{
"name" : "aa",
"child" : [
{
"name" : "aaa",
"child" : [
{
"name" : "aaaa",
"child" : []
}
]
},
{
"name" : "aab",
"child" : []
}
]
},
{
"name" : "ab",
"child" : [
{
"name": "aba",
"child" : []
}
]
}
]
},
{
"name": "b",
"child" : [
{
"name" : "bb",
"child" : [
{
"name" : "bbb",
"child" : []
}
]
}
]
}
]
代码:
function fn(arr){
if( arr.length == 0 ){
return [];
}
let items = [...new Set(arr.map( p=>p[0] ))];
//p原本是arr[0]/arr[1]/arr[2]/arr[3] p[0]是指arr[0][0]/arr[1][0]/arr[2][0]/arr[3][0]即a,b,a,a赋值给p
//经过...new Set()去重排序后为a,b items = ["a","b"]
items = items.map( name=>{
let child = arr.filter( p=>p[0]==name ).map( r=>r.slice(1) );
//arr.filter( p=>p[0]==name )是指[["a", "aa", "aaa", "aaaa"],["a", "ab", "aba"],["a", "aa", "aab"]],[["b", "bb", "bbb"]]]
//arr.filter( p=>p[0]==name ).map( r=>r.slice(1) )是指[["aa","aaa","aaaa"],["ab","aba"],["aa","aab"]],[["bb","bbb"]]]"
if( child && child[0].length ){
return{
name,
child:fn(child)//递归执行
}
}else{
return{
name,
child:[]
}
}
} )
return items;
}
let data =[["a", "aa", "aaa", "aaaa"],["b", "bb", "bbb"],["a", "ab", "aba"],["a", "aa", "aab"]];
let res = fn( data );
console.log( JSON.stringify( res,null,2 ) )
//JSON.stringify()第一个参数为obj或者数组 第二个参数为用于转换结果的函数或数组 第三个参数为返回值文本在每个级别缩进指定数目的空格
主要用到 …newSet() / arr.map / arr.filter / arr.slice() / JSON.stringify()
重视js基础