第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 JavaScript 中使用縮進從平面列表構建樹?

如何在 JavaScript 中使用縮進從平面列表構建樹?

慕慕森 2023-06-09 10:50:11
面對這個問題時,我總是很掙扎,這需要一些認真的工作。我目前正在嘗試解決這個問題,可能需要幾天時間。想看看您是否有解決此問題的系統(tǒng)或簡單方法。基本上,假設您有一個 DOM 節(jié)點的平面列表,其中以 15px 的步長向左填充縮進。在視覺上,它像文件瀏覽器一樣形成一棵樹。但在 DOM 的結構上,它是作為平面列表實現(xiàn)的。然后如何遍歷列表并構建樹?<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>...那應該變成這樣的 JSON 樹:[   {    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: []  }]你怎么做到這一點?我迷路了: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))}
查看完整描述

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));


查看完整回答
反對 回復 2023-06-09
?
慕工程0101907

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>


查看完整回答
反對 回復 2023-06-09
  • 2 回答
  • 0 關注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號