关于一道简单的面试编程题我做了一个多小时这件事

1,114 阅读2分钟

起因

情况是这么个情况,最近公司在招人,然后我们前端leader负责面试,她出了一道编程题,题目是这样的

  • 请书写两种方法,方法一:将以下数据源处理成树形结构,方法二:将树形结构数据源进行扁平化操作
let arr =[
  {"id": 1, "parent_id": 0, "name": "Atar"},
  {"id": 2, "parent_id": 0, "name": "Lier"},
  {"id": 3, "parent_id": 0, "name": "广东省"},
  {"id": 11, "parent_id": 1, "name": "顺义区"},
  {"id": 12, "parent_id": 1, "name": "朝阳区"},
  {"id": 13, "parent_id": 1, "name": "lili"},
  {"id": 21, "parent_id": 2, "name": "sdfsd"},
  {"id": 22, "parent_id": 2, "name": "X"},
  {"id": 24, "parent_id": 2, "name": "(iLX"},
  {"id": 241, "parent_id": 24, "name": "田林街道"},
  {"id": 242, "parent_id": 24, "name": "漕河泾街道"},
  {"id": 2421, "parent_id": 242, "name": "上海科技绿洲"},
  {"id": 2422, "parent_id": 242, "name": "漕河泾开发区"},
  {"id": 31, "parent_id": 3, "name": "~Ni"},
  {"id": 32, "parent_id": 3, "name": "it"},
  {"id": 33, "parent_id": 3, "name": "I"}
];

然后就是这样一个简单的编程题,leader面完试回来之后说,今天的两位候选人都没有做出来,然后同事就问了一下工作年限,leader说都是工作5-7年的,我当时也很纳闷,我自认为也很简单,只要通过parent_id去判断,然后做成树结构就行,扁平化的话用children加递归处理即可

想法很完美,现实很残酷,抱着这样的思路我自己去尝试了一下

  • 代码演示
// 将数组进行扁平化
function treeToArr(arr){
  let newArr = [];
  function flatArr(childrenArr){
    if(Array.isArray(childrenArr) && childrenArr.length > 0){
      childrenArr.map((item)=>{
        if(item.children.length > 0){
          flatArr(item.children)
        }
        newArr.push({...item})
      })
    }else{
      return childrenArr
    }
  }
  flatArr(arr)
  return newArr.map((item)=>{
    delete item.children
    return item
  })
}
// 数组转换为树结构
function arrToTree(arr){
  if(Array.isArray(arr) && arr.length > 0){
    let childrenIndex = []; // 已存的所有children的索引
    let newArr = arr.map((item)=>{
      let children;
      children = arr.filter((childrenItem,index)=>{
        if(item.id == childrenItem.parent_id && childrenIndex.indexOf(index) == -1) {
          childrenIndex.push(index)
        }
        return item.id == childrenItem.parent_id
      })
      item.children = children
      return item
    })
    return newArr.filter((item,index)=>{
      return childrenIndex.indexOf(index) == -1
    });
  }else{
    return arr
  }
}
console.log("#####111",arrToTree(arr));
console.log("#####2222",treeToArr(arrToTree(arr)));

就这样简单的一个需求,我做了一个半小时还多,而且做出来的只是勉强完成要求,真的是gpt用久了独立去写一些东西的时候人都傻了,不是这出点小问题就是那出点小问题,同时这也是我现在脑子里想到的唯一的一种处理方式,作为一个从业三年的我来说这个水平实属菜了

出现的问题

  • 一开始做的第一版树结构扁平化递归适用不当会将已有的children继续塞进数组里,出现大量重复数据
  • 将数组处理成树结构忘记把已经归档到children下的数据删除,导致结构化后数据仍然是16条与原数组长度一致

最后

记录一下自己出现的问题,希望下次自己再遇到类似的问题不会再处理那么久,不知道各位大佬遇到这样的题目需要做多久呢