// ['1600639146', '文件夹1', '新建文件夹' ]表示1600639146文件夹下有一个文件夹1,文件夹1下有一个新建文件夹
[
[ '1600639146', '文件夹1', '新建文件夹' ],
[ '1600639146', '文件夹1' ],
[ '1600639146', '文件夹3' ],
[ '1600639146', '文件夹2' ]
]
转换为
[
label: '1600639146',
children: [
{
label: '文件夹1',
children: [{
label: '新建文件夹'
}]
}, {
label: '文件夹2'
}, {
label: '文件夹3'
}]
]
由于项目需要,需要实现以上这个结果,请算法朋友解答一下。
此贴终结,最终代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
const result = [
['1600639146', '文件夹1'],
[ '1600639146', '文件夹1', '新建文件夹' ],
[ '1600639146', '文件夹1', '新建文件夹', '文件夹' ],
[ '1600639146', '文件夹3' ],
['1600639146', '文件夹2', '新文件夹', '文件夹', 'folder'],
['1600639146', '文件夹2'],
['1600639146', '文件夹2', '新文件夹'],
['1600639146', '文件夹2', '新文件夹', '文件夹']
]
function solve(arr) {
let rootStr = null
arr.forEach(folderPath => {
rootStr = folderPath.shift()
})
arr = arr.sort((x, y) => {
return x.length - y.length
})
const rootNode = { label: rootStr }
arr.forEach(folderPath => {
onTree(rootNode, folderPath)
})
console.log('rootNode', rootNode)
}
function onTree(node, path) {
const root = node
for (let i = 0; i < path.length - 1; i++) {
node = node.children.find(item => item.label === path[i])
}
if (node.children) {
node.children.push({
label: path[path.length - 1]
})
} else {
node.children = [{
label: path[path.length - 1]
}]
}
}
solve(result)
</script>
</body>
</html>
第二个数据结构应为:
[{
label: '1600639146',
children: [
{
label: '文件夹1',
children: [{
label: '新建文件夹'
}]
}, {
label: '文件夹2'
}, {
label: '文件夹3'
}]
}
]
这明显就是要将以前的“散装列表”传参方式改成JSON传参方式。。。。这个有几个层级的数据就要进行几次遍历来做数据上下级对应关联。如果确定就是三个层级没有更多层级,那么还是可以考虑写个转换函数。
一旦有更多层级,那么建议就不要用这种列表参数了,初始传值直接就用JSON格式或XML格式得了。