记两道钉钉JS笔试题目

42 阅读1分钟
// 问题一
/** 实现一个queryString,具有parse能力,
 * parse,用于把一个URL查询字符串解析成一个键值对的集合。
 * 输入:查询字符串 'foo=bar&abc=xyz&abc=123'
 * 输出:一个键值对的对象
 * {
 *   foo: 'bar',
 *   abc: ['xyz', '123'],
 * }
 */

class QueryString {
  static parse(input) {
    const paires = input?.split('&');
    const obj = paires.reduce((obj,str)=>{
      const [key,value] = str?.split('=')
      if(obj[key]===undefined){
        obj[key]=value
        return obj;
      }
      if(typeof value === 'string'){
        obj[key]=[obj[key]]
        obj[key].push(value)
      }else{
        obj[key].push(value)
      }
      return obj
    },{})
  }
}


// 问题二
// 实现 convert2Tree 方法将下面数组根据 id 和 parentId 转成树状
// 要求时间复杂度O(n)

const data = [
  { id: 4, parentId: 3, label: '4' },
  { id: 3, parentId: 1, label: '3' },
  { id: 2, parentId: 1, label: '2' },
  { id: 1, parentId: null, label: '1' },
  // ...
];

convert2Tree(data);
// { id: 1, label: "", children: [
//     { id: 2, label: '2', children: [] },
//     { id: 3, label: '3', children: [
//         { id: 4, label: '4', children: [] }
//     ]}
// ]}

function convert2Tree(data) {
    let index=0;
    const mapper = {}
    let rootId
    while(index<data.length){
      const {parentId,id, label} = data[index]
      if(mapper[parentId]===undefined && parentId!==undefined){
        mapper[parentId]={
          id:parentId,
          children:[],
          label:'',
          parentId:undefined
        }
      }
      // 当前节点
      if(mapper[id]===undefined){
        const node = {
              id,
              label,
              children:[],
              parentId
        }
        mapper[id] = node
      }else{
        mapper[id].label = label // parent label更新
      }
      if(parentId!==undefined){
        mapper[parentId].children.push(node)
      }else{
        rootId = id
      }
      
      index+=1
    }

    return mapper[rootId]
}