2 回答

TA貢獻1995條經(jīng)驗 獲得超2個贊
它是一個堆棧,因為它是順序的。是這樣的嗎?
我們假設文件夾結構是完全“展開”的,因此必須在當前文件夾之前檢查每個文件夾的父文件夾(最低的文件夾除外,父文件夾是根目錄)。父級還必須具有較低的“padding-left”分配。
ptrs是一個堆棧,我們將引用附加到下一個檢查的文件夾。堆棧頂部(末尾)的文件夾是我們檢查的最后一個文件夾。如果堆棧頂部的那些文件夾具有高于或等于“padding-left”分配,則它們不可能是當前文件夾的父級;在當前文件夾之后我們不可能有更多的孩子,所以我們刪除(彈出)它們,直到我們找到最后一個放置的具有較低“padding-left”的文件夾。
function getData(s){
const left = +s.match(/\d+/)[0];
const title = s.match(/[A-Z]+/)[0];
return [left, title];
}
function f(divs){
const tree = {
title: 'root',
children: []
};
const ptrs = [[0, tree]]; // stack
for (let str of divs){
const [left, title] = getData(str);
while (ptrs.length && ptrs[ptrs.length-1][0] >= left)
ptrs.pop();
parent = ptrs.length ? ptrs[ptrs.length-1][1] : tree;
const obj = {title: title, children: []};
parent.children.push(obj);
ptrs.push([left, obj]);
}
return tree;
}
var divs = [
"<div style='padding-left: 0px'>A</div>",
"<div style='padding-left: 15px'>AA</div>",
"<div style='padding-left: 15px'>AB</div>",
"<div style='padding-left: 30px'>ABA</div>",
"<div style='padding-left: 30px'>ABB</div>",
"<div style='padding-left: 45px'>ABBA</div>",
"<div style='padding-left: 45px'>ABBB</div>",
"<div style='padding-left: 45px'>ABBC</div>",
"<div style='padding-left: 30px'>ABC</div>",
"<div style='padding-left: 15px'>AC</div>",
"<div style='padding-left: 0px'>B</div>",
"<div style='padding-left: 0px'>C</div>"
]
console.log(f(divs));

TA貢獻1887條經(jīng)驗 獲得超5個贊
有趣的練習。這是另一種方法,它比之前的解決方案更冗長,但也適用于 dom 節(jié)點而不是字符串 html
const buildTree = (selector) => {
const elems = [...document.querySelectorAll(selector)]
.map((el,i)=>({el, title: el.textContent, idx:i, inset: parseInt(el.style.paddingLeft)}));
const getChildren = ({inset:pInset, idx:start}) => {
const nextParentIdx = elems.findIndex(({inset, idx}, i)=> inset <= pInset && i >start);
const desc = elems.slice(start, nextParentIdx+1 )
.filter(({inset})=>inset-pInset === 15);
return desc.map(getItem);
}
const getItem = (o)=>{
return {title: o.title, children: getChildren(o)}
}
return elems.filter(({inset})=>!inset).map(getItem)
}
console.log(JSON.stringify(buildTree('div'),null, 4))
.as-console-wrapper { max-height: 100%!important;top:0;}
<div style='padding-left: 0px'>A</div>
<div style='padding-left: 15px'>AA</div>
<div style='padding-left: 15px'>AB</div>
<div style='padding-left: 30px'>ABA</div>
<div style='padding-left: 30px'>ABB</div>
<div style='padding-left: 45px'>ABBA</div>
<div style='padding-left: 45px'>ABBB</div>
<div style='padding-left: 45px'>ABBC</div>
<div style='padding-left: 30px'>ABC</div>
<div style='padding-left: 15px'>AC</div>
<div style='padding-left: 0px'>B</div>
<div style='padding-left: 0px'>C</div>
添加回答
舉報