最近碰到一个面试题: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)