树结构和扁平化数组之间的转化的方法

95 阅读1分钟

树结构转扁平化数组

树结构转扁平化数组的基本方法都是使用递归,实际情况需要根据自己的需求去修改自己需要的字段。 先模拟一个简单的树结构

let tree = [
  {
    id: 1,
    label: '第一级',
    children: [
      {
        id: 11,
        label: '第1-1级',
        children: [
          {
            id: 111,
            label: '第1-1-1级',
          },
          {
            id: 112,
            label: '第1-1-2级',
          }
        ]
      }
    ]
  },
  {
    id: 2,
    label: '第二级',
    children: [
      {
        id: 21,
        label: '第2-1级',
      },
      {
        id: 22,
        label: '第2-2级',
      }
    ]
  }
]

第一种方法

function treeToArr(arr) {
  let newArr = []
  arr.forEach(obj => {
    let newObj = {
      id: obj.id,
      label: obj.label
    }
    newArr.push(newObj)
    if (obj.hasOwnProperty('children')) {
      newArr = newArr.concat(treeToArr(obj.children))
    }
  });
  return newArr;
}

// 输出结果
[
  { id: 1, label: '第一级' },
  { id: 11, label: '第1-1级' },
  { id: 111, label: '第1-1-1级' },
  { id: 112, label: '第1-1-2级' },
  { id: 2, label: '第二级' },
  { id: 21, label: '第2-1级' },
  { id: 22, label: '第2-2级' }
]

有的树结构字段比较多,但实际只能使用到2~3个字段,所以我定义了 newObj 只取自己需要的字段,如果不需要可以直接去掉。

第二种方法

function treeToArr(data) {
  return data.reduce((arr, {id, label, children = []}) => 
      arr.concat([{id, label}], treeToArr(children)), []);
}

2个方法实际都是使用了递归去解决这个问题,第二个代码更简洁,可以根据自己的喜好去选择。

扁平化数组转树结构

let arr = [
  {id: 1, label: '第一级', pid: 0},
  {id: 2, label: '第二级', pid: 0},
  {id: 11, label: '第1-1级', pid: 1},
  {id: 12, label: '第1-2级', pid: 1},
  {id: 111, label: '第1-1-1级', pid: 11},
  {id: 21, label: '第2-1级', pid: 2},
]

function ArrToTree(arr) {
  const treeData = []
  arr.forEach(item=>{
      if(!item.pid){
        treeData.push(item)
      }
      const children = list.filter(data=>data.pid ===item.id)
      if(!children.length) return
      item.children=children
  })
  return treeData
}

方法都是比较简单实用的,希望可以帮到大家。