js将树形结构转为数组

1. 数据结构

a. 树形结构

const treeStructure = {
  name: Id, // name为Id,可以为Number, String. 唯一值
  children: [treeStructure], // treeStructure可为空
  // 其他属性省略
}
  

实例

const treeData = {
  name: 1,
  children: [{
    name: 2,
    children: [{
      name: 4,
      children: [{
        name: 7,
        children: [{
          name: 8,
          children: []
        }, {
          name: 9,
          children: []
        }]
      }],
    }, {
      name: 5,
      children: [],
    }]
  }, {
    name: 3,
    children: [{
      name: 6,
      children: [],
    }],
  }],
}

b. 数组结构

[{
  // 其他属性省略
  name: Id,
  children: [Id],
}]

实例输出结果

[
  { name: 1, children: [ 2, 3 ] },
  { name: 2, children: [ 4, 5 ] },
  { name: 4, children: [ 7 ] },
  { name: 7, children: [ 8, 9 ] },
  { name: 8, children: [] },
  { name: 9, children: [] },
  { name: 5, children: [] },
  { name: 3, children: [ 6 ] },
  { name: 6, children: [] }
]

2. 算法实现

// 递归
// 1. 结束条件 treeData为空,返回[]
// 2. 结束条件 treeData不为空 返回[当前元素].concat(transfer(子元素))
// 需要实现transfer函数, 输入树形结构, 输出结果为一个一维数组:arrayData
function transfer(treeData) {
  if (!(!treeData.hasOwnProperty('name') || !treeData)) {
    let arr = []
    let obj = {}
    obj.name = treeData.name
    obj.children = treeData.children.map(value => {
      // [1] arr = arr.concat(transfer(value)) 
      return value.name
    })
    arr.push(obj)
    
    // 这段代码可由代码 [1] 替代,替代后父元素在子元素后
    treeData.children.forEach(value => {
      arr = arr.concat(transfer(value))
    })
    //
    
    return arr
  } else { // 初始treeData是否为空树
    return []
  }
}

const arrayData = transfer(treeData); // arrayData是一个一维数组, 每个item是一个tree的节点
console.log(arrayData)

js将数组转为树形结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值