面试算法题

最近这面试题不得不说,简直是有点非人类的感觉,在正常的业务逻辑中不应该出现这样的数据处理逻辑,如果有,我要跟后端打一架!!
不过既然是面试,那只能见招拆招,兵来将挡水来土掩。
废话不多说,看题

  const pathList = ["/a/b", "/a/2/c", "/d"];
    /**
     * 如上,输入是一个一维String数组pathList,里面记录了由"/"分隔的字符串,
     * 表示了用户在系统中存储的目录结构
     * 现在需要将这个目录结构进行结构化,方便使用Echarts等可视化组件进行绘制
     * 结构化的要求:将目录结构以嵌套对象的形式表现出来,如最后23~31行的注释
     *
     * 实现要求:请实现下面的pathFormat方法,完成这个结构化的过程
        {
          "a": {
            "2": {
              "c": {}
            },
            "b": {}
          },
          "d": {}
        }
     */

解:
// 写的着急,方法不太好,发出来也是为了记录学习,请各位大佬多多指点

    function pathFormat(pathList) {
        const answer = {}; // todo: 将pathList转化成目标结构,更新到answer中
       	// 递归将字符串转换声深层对象
        const fn = (key, obj) => {
            let objCopy = {}
            let num = obj && Object.keys(obj)
            if (!!num) {
                if (num.length == 0) {
                    obj[key] = {}
                } else {
                    obj[num[0]] = fn(key, obj[num[0]])
                }
            }
            objCopy = JSON.parse(JSON.stringify(obj))
            return objCopy
        }
        // 递归将多个深层对象进行key值匹配,去掉重复的,留下不同的
        const deepObjectMerge = (original, mergeOBJ) => { // 深度合并对象
            for (var key in mergeOBJ) {
                original[key] = original[key] && original[key].toString() === "[object Object]" ?
                    deepObjectMerge(original[key], mergeOBJ[key]) : original[key] = mergeOBJ[key];
            }
            return original;
        }
        // 循环每一项递归处理
        pathList.forEach(element => { // 循环截取掉/
            let a = {}
            for (const key in element) {
                if (element[key] !== '/') {
                    a = fn(element[key], a)
                }
            }
            deepObjectMerge(answer, a)
        });

        return answer;
    }
    console.log(JSON.stringify(pathFormat(pathList), null, 2));
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值