Je lutte toujours lorsque je suis confronté à ce problème, et cela demande un sérieux travail. Je suis actuellement en train d'essayer de résoudre ce problème et cela va probablement me prendre quelques jours. Je voulais voir si vous aviez un système ou une manière simple de résoudre ce problème.
En gros, imaginez que vous ayez une liste plate de nœuds DOM avec une indentation de padding left par étapes de 15px. Visuellement, cela forme un arbre comme un navigateur de fichiers. Mais structurellement dans le DOM, c'est implémenté comme une liste plate. Comment pouvez-vous alors itérer à travers la liste et construire un arbre?
A
AA
AB
ABA
ABB
ABBA
ABBB
ABBC
ABC
AC
B
C
...
Cela devrait ensuite devenir un arbre JSON comme ceci:
[
{
title: 'A',
children: [
{
title: 'AA',
children: []
},
{
title: 'AB',
children: [
{
title: 'ABA',
children: []
},
{
title: 'ABB',
children: [
{
title: 'ABBA',
children: []
},
{
title: 'ABBB',
children: []
},
{
title: 'ABBC',
children: []
}
]
},
{
title: 'ABC',
children: []
}
]
},
{
title: 'AC'
}
]
},
{
title: 'B',
children: []
},
{
title: 'C',
children: []
}
]
Comment faire cela? Je suis perdu:
let tree = []
let path = [0]
let items = list('div')
items.forEach(item => {
let left = parseInt(item.style[`padding-left`] || 0) % 15
let set = tree
let p = path.concat()
while (left) {
let x = p.shift()
set[x] = set[x] || { children: [] }
set = set[x].children
left--
}
})
function list(s) {
return Array.prototype.slice.call(document.querySelectorAll(s))
}