[算法部分-JS] - 扁平化

56 阅读1分钟

数组扁平化 -- reduce

const arr = [1, 2, [3, 4],[5, [6, 7, [8, [9]], 10]], [11, 12]]
const myFlat = (arr) => {
return arr.reduce((pre, cur) => {
  if (Array.isArray(cur)) {
    return pre.concat(myFlot(cur))
  } else {
      return pre.concat(cur)
    }
  }, [])
}
console.log(myFlat(arr))  // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

对象数组扁平化为树 -- 递归&Map

let arr = [{
  id: 1,
  name: '部门1',
  pid: 0
},{
  id: 2,
  name: '部门2',
  pid: 1
},{
  id: 3,
  name: '部门3',
  pid: 1
},{
  id: 4,
  name: '部门4',
  pid: 3
},{
  id: 5,
  name: '部门5',
  pid: 4
}]

// 数组遍历
const getChildren = (arr, result, id) => {
  arr.forEach((item) => {
    if(item.pid === id) {
      const newItem = {...item, children: []}
      result.push(newItem)
      getChildren(arr, newItem.children, newItem.id)
    }
  })
  return result
}

const flatObjArr = (arr, id) => {
  let result = []
  getChildren(arr, result, id)
  return result
}

flatObjArr(arr, 0)

// Map
function arrayToTree(items) {
  const result = []
  const itemMap = {}
  for (const item of items) {
    itemMap[item.id] = {
      ...item,
      children: []
    }
  }
    console.log('map储存', itemMap)
    items.forEach((item) => {
    let id = item.id
    let pid = item.pid
    let treeItem = itemMap[id]
    if (pid === 0) {
      result.push(treeItem)
    } else {
      if (1) {
        itemMap[pid].children.push(treeItem)
      }
    }
  })
  console.log('结果', itemMap, result)
}
arrayToTree(arr)