扁平数据结构转tree
let arr = [
{
id : 1 , name : '分部1' , parentsId : 0 } ,
{
id : 2 , name : '分部2' , parentsId : 1 } ,
{
id : 3 , name : '分部3' , parentsId : 1 } ,
{
id : 4 , name : '分部4' , parentsId : 3 } ,
{
id : 5 , name : '分部5' , parentsId : 4 } ,
]
[
{
"id" : 1 ,
"name" : "分部1" ,
"parentsId" : 0 ,
"children" : [
{
"id" : 2 ,
"name" : "分部2" ,
"parentsId" : 1 ,
"children" : [ ]
} ,
{
"id" : 3 ,
"name" : "分部3" ,
"parentsId" : 1 ,
"children" : [
{
"id" : 4 ,
"name" : "分部4" ,
"parentsId" : 3 ,
"children" : [
{
"id" : 5 ,
"name" : "分部5" ,
"parentsId" : 4 ,
"children" : [ ]
}
]
}
]
}
]
}
]
递归解法
const getChildren = ( data, result, pid ) => {
for ( const item of data) {
if ( item. parentsId === pid) {
const newItem = {
... item, children : [ ] } ;
result. push ( newItem) ;
getChildren ( data, newItem. children, item. id) ;
}
}
}
const arrayToTree = ( data, pid ) => {
const result = [ ] ;
getChildren ( data, result, pid)
return result;
}
for循环+Map
function arrayToTree ( arr ) {
const result = [ ] ;
const itemMap = {
} ;
for ( const item of arr) {
itemMap[ item. id] = {
... item, children : [ ] }
}
for ( const item of arr) {
const id = item. id;
const pid = item. parentsId;
const treeItem = itemMap[ id] ;
if ( pid === 0 ) {
result. push ( treeItem) ;
} else {
if ( ! itemMap[ pid] ) {
itemMap[ pid] = {
children : [ ] ,
}
}
itemMap[ pid] . children. push ( treeItem)
}
}
return result;
}
function arrayToTree ( arr ) {
const result = [ ] ;
const itemMap = {
} ;
for ( const item of arr) {
const id = item. id;
const pid = item. pid;
itemMap[ id] = {
... item,
children : [ ]
}
const treeItem = itemMap[ id] ;
if ( pid === 0 ) {
result. push ( treeItem) ;
} else {
if ( ! itemMap[ pid] ) {
itemMap[ pid] = {
children : [ ] ,
}
}
itemMap[ pid] . children. push ( treeItem)
}
}
return result;
}
结构扁平化
对象扁平化
let obj = {
a : {
d : 1 } ,
d : 2 ,
e : [ 3 , 4 ] ,
f : {
} ,
g : [ ]
}
function flatten ( data ) {
var result = {
} ;
function recurse ( cur, prop ) {
if ( Object ( cur) !== cur) {
result[ prop] = cur;
} else if ( Array. isArray ( cur) ) {
for ( var i = 0 , len = cur. length; i < len; i++ )
recurse ( cur[ i] , prop + ` [ ${
i} ] ` ) ;
if ( len == 0 ) result[ prop] = [ ] ;
} else {
var isEmpty = true ;
for ( var p in cur) {
console. log ( prop, p)
isEmpty = false ;
recurse ( cur[ p] , prop ? ` ${
prop} . ${
p} ` : p) ;
}
if ( isEmpty && prop)
result[ prop] = {
} ;
}
}
recurse ( data, "" ) ;
return result;
} ;
console. log ( flatten ( obj) )
数组扁平化
toString()+split()
let arr = [ 1 , [ 2 , 3 , [ 4 , 5 ] ] ]
function flat ( arr ) {
return arr. toString ( ) . split ( ',' ) . map ( item => Number ( item) )
}
console. log ( flat ( arr) )
reduce
let arr = [ 1 , [ 2 , 3 , [ 4 , 5 ] ] ]
const flat = function ( arr ) {
return arr. reduce ( ( pre, cur ) => pre. concat ( Array. isArray ( cur) ? flat ( cur) : cur) , [ ] )
}
console. log ( flat ( arr) ) ;
递归
let arr = [ 1 , [ 2 , 3 , [ 4 , 5 ] ] ]
function flat ( arr ) {
var res = [ ] ;
arr. map ( item => {
if ( Array. isArray ( item) ) {
res = res. concat ( flat ( item) ) ;
} else {
res. push ( item) ;
}
} ) ;
return res;
}
console. log ( flat ( arr) )
扩展运算符+some
let arr = [ 1 , [ 2 , 3 , [ 4 , 5 ] ] ]
function flat ( arr ) {
while ( arr. some ( item => Array. isArray ( item) ) ) {
arr = [ ] . concat ( ... arr) ;
}
return arr;
}
console. log ( flat ( arr) ) ;
flat()
let arr1 = [ 1 , 2 , [ 3 , 4 ] ] ;
arr1. flat ( ) ;
let arr2 = [ 1 , 2 , [ 3 , 4 , [ 5 , 6 ] ] ] ;
arr2. flat ( 1 ) ;
let arr3 = [ 1 , 2 , [ 3 , 4 , [ 5 , 6 ] ] ] ;
arr3. flat ( 2 ) ;
let arr4 = [ 1 , 2 , [ 3 , 4 , [ 5 , 6 ] ] ]
arr4. flat ( Infinity ) ;
let arr5 = [ 1 , 2 , , 4 , 5 ] ;
arr5. flat ( ) ;