最近碰到一个面试题:let s = ["/data/a","/data/b","/var/a"]数组中的结构变成一个树形结构:

      root

/           \

data    var

/   \        /

a    b    a

方法一:

// 1.首先设计数据结构:
{
    name: "xxx",
    children:[]
}

// 2.将其解析成树结构。
let s = ["/data/a","/data/b","/var/a"]

function tree(name) {
    this.name = name
    this.children = []
}

let res = new tree("root")
for(let i = 0; i < s.length; i++) {
    s[i] = s[i].split("/")
    s[i].reduce((pre, item, index)=>{
        if(index === 0) {
            return pre
        }
        for(let j = 0; j < pre.length; j++) {
            if(pre[j].name === item) {
                return pre[j].children
            }
        }
        let temp = new tree(item)
        pre.push(temp)
        return temp.children
        
    },res.children)
}
console.log(res)

方法二:优化。相对于方法一,我们可以发现,在第二个for循环中,我们要查找item有没有出现过,这里是耗时的。为了查找的更快,我们可以直接使用map来进行放置对象。因此整个数据结构,改成map的形式。

// 1.首先设计数据结构:
// 使用map进行存储,map的key值是name,value值又是一个map
// 2.将其解析成树结构。
let s = ["/data/a","/data/b","/var/a"]
let res = new Map()
res.set("root",new Map());
for(let i = 0; i < 3; i++) {
    s[i] = s[i].split("/")
    s[i].reduce((pre, item, index)=>{
        if(index === 0) {  //s[0]为undefined,不能使用。
            return pre
        }

        if(pre.get(item)) {
            return pre.get(item)
        }
        pre.set(item, new Map())
        return pre.get(item)
    },res.get("root"))
}
console.log(res)