qappleh / Interview

我是追梦赤子心,公众号「深圳湾码农」的作者,某上市集团公司高级前端开发,深耕前端领域多年,每天攻破一道题,带你从0到1系统构建web全栈完整的知识体系!
https://github.com/qappleh/Interview
1.14k stars 95 forks source link

Day382:使用 TypeScript 语法将没有层级的扁平数据转换成树形结构的数据? #385

Open qappleh opened 3 years ago

qappleh commented 3 years ago
// 扁平数据
[{
  name: '文本1',
  parent: null,
  id: 1,
}, {
  name: '文本2',
  id: 2,
  parent: 1
}, {
  name: '文本3',
  parent: 2,
  id: 3,
}]

// 树状数据
[{
  name: '文本1',
  id: 1,
  children: [{
    name: '文本2',
    id: 2,
    children: [{
      name: '文本3',
      id: 3
    }]
  }]
}]
guanxc9876 commented 3 years ago
getTree(data) {
  const backArr = JSON.parse(JSON.stringify(data)).reverse()
  let childArr = []
  let treeArr = []
  function recursion(arr1) {
    if (arr1.length === 1) {
      arr1[0].children = childArr
      treeArr = JSON.parse(JSON.stringify(arr1))
    } else {
      if (childArr.length) {
        arr1[0].children = childArr
        childArr = []
      }
      childArr.push(arr1.shift())
      recursion(arr1)
    }
  }
  recursion(backArr)
  return treeArr
},
adaex commented 3 years ago

interface ListItem {
  id: number
  name: string
  parent: number | null
}

interface TreeItem {
  id: number
  name: string
  children: TreeItem[]
}

function list2tree(list: ListItem[]): TreeItem[] {
  const temp = {} as { [id: number]: TreeItem }
  const tree = [] as TreeItem[]

  // 临时储存
  list.forEach(({ id, name }) => {
    temp[id] = { id, name, children: [] }
  })

  // 遍历处理
  list.forEach(({ id, parent }) => {
    if (parent === null) {
      tree.push(temp[id])
    } else if (temp[parent]) {
      temp[parent].children.push(temp[id])
    }
  })
  return tree
}
adaex commented 3 years ago

测试


const list = [
  {
    name: '文本1',
    parent: null,
    id: 1,
  },
  {
    name: '文本2',
    id: 2,
    parent: 1,
  },
  {
    name: '文本3',
    parent: 2,
    id: 3,
  },
]

const tree = list2tree(list)
console.log(JSON.stringify(tree, undefined, 2))

输出

[
  {
    "id": 1,
    "name": "文本1",
    "children": [
      {
        "id": 2,
        "name": "文本2",
        "children": [
          {
            "id": 3,
            "name": "文本3",
            "children": []
          }
        ]
      }
    ]
  }
]