- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
面对这个问题,我总是很挣扎,这需要一些认真的工作。我目前正在尝试解决这个问题,可能需要几天时间。想看看您是否有解决此问题的系统或简单方法。
基本上,假设您有一个 DOM 节点的平面列表,其中以 15px 的步长填充左缩进。在视觉上,它形成了一个像文件浏览器一样的树。但在 DOM 中的结构上,它被实现为一个平面列表。然后,您如何遍历列表并构建树?
<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))
}
最佳答案
这是一个堆栈,因为它是顺序的。像这样的东西?
我们假设文件夹结构是完全“扩展的”,因此每个文件夹的父级(除了最低级,其父级是根)必须在当前文件夹之前进行检查。父级还必须具有较低的“padding-left”分配。ptrs
是一个堆栈,我们在其中附加对下一个检查文件夹的引用。堆栈顶部(末尾)的文件夹是我们检查的最后一个文件夹。如果堆栈顶部的那些文件夹具有高于或等于“padding-left”的分配,它们不可能是当前文件夹的父级;并且我们不可能在当前文件夹之后拥有更多的 child ,因此我们删除(弹出)它们,直到我们找到放置的最后一个具有较低“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));
关于javascript - 如何在 JavaScript 中从带有缩进的平面列表构建树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64509334/
我正在使用 libxml2 的 xmlwriter api 编写一个 xml 文件。 当我使用记事本打开文件时,缩进不正确。 有人知道怎么解决吗? 非常感谢。 最佳答案 我在这里有点冒进,但我会说“缩
我正在尝试让这个脚本工作,但它...给我缩进错误 #!/usr/bin/env python import io myfile = open('stats.txt', 'r') dan = myfil
我使用 Emacs 有一段时间了,我真的很想念一个古老的 Geany 快捷方式 - “C-i”和“C-u”。 “C-i”缩进整个当前行(将鼠标光标保持在原处),“C-u”取消整个当前行的缩进。 我发现
如何向 UILabel 内的文本添加缩进或偏移?它需要是特定的像素大小,与字体大小无关。 最佳答案 您可以创建另一个UILabel,然后将每个标签的框架设置为一定的宽度,这样,如果您想要实现这一目标,
请帮我在 Emacs haskell-mode 中设置正确的缩进 当我尝试输入诸如 ADT 或记录之类的内容时,按 后我进入了错误的列。 ,然后按 不会切换到右边,直到我输入 |或者 ';'! d
我在 Visio 2010 中有一个项目符号列表,我试图在其中缩进二级项目符号。例如: 我希望“子项目符号”项目向右缩进,这样很明显它是一个子元素。我认为功能区上的“增加缩进”选项可以做到这一点,但这
我写了这段代码: addNums key num = add [] key num where add res a:as b:bs | a == [] = res
我在生成的 xml 文档中添加了换行符。 "\n" some text etc."\n" "\n" 这最终应该是: some text etc. 这是否可以通过 google-code-pre
使用 JTabbedPane 时,如何缩进选项卡? Swing 默认输出: ------- --------- ------ | A | | B | | C | --------
我收到这些行的缩进错误 有没有在线验证器可以帮助我? showAliveTests : (pageIndex, statusFilter) -> data= pageI
在 Python 中,当你写了 100 行代码而忘记在某个地方添加一堆循环语句时,你会怎么做? 我的意思是,如果您在某处添加一个 while 语句,您现在必须缩进它下面的所有行。这不像您可以戴上牙套并
我喜欢这样做,如 indesign 或 quark...段落缩进...图片 如何在 html 和 css 中做到这一点的正确方法 我不希望文字环绕图像...我喜欢保护整个左边的部分给图片留边距就可以了
我试过添加 10px 的内边距但没有成功。你可以看到它的一个例子lower down on this page . #menu li { float: left;
这个问题在这里已经有了答案: I'm getting an IndentationError. How do I fix it? (6 个答案) 关闭去年。 while 1 == 1:
您好,我正在尝试使用来自 C# 应用程序的收据打印机打印帐单/收据。 预期的输出是这样的: ITEM NAME QTY PRICE Banana Large Y
有没有办法在 JTextPane 中缩进一段文本? import javax.swing.*; import java.awt.*; import javax.swing.text.StyledDoc
我知道 #define 等通常从不缩进。为什么? 我目前正在编写一些代码,其中混合了#define、#ifdef、#else s、#endifs 等。所有这些通常与普通 C 代码混合在一起。 #def
我认为缩进在 YAML 中很重要。 我在 irb 中测试了以下内容: > puts({1=>[1,2,3]}.to_yaml) --- 1: - 1 - 2 - 3 => nil 我期待这样的事情:
我在带有 openmp 语句的 C++ 代码中使用 Vim。 而在我的 ~/.vimrc set ai " auto indent 我的问题:当我使用 openmp 语句(以 # 开头)时,光标会跳
我想使用 Megaparsec 解析一种基本的缩进语言。最初我使用的是 Parsec,我设法通过缩进正常工作,但现在我遇到了一些麻烦。 我一直在关注一个教程here这是我必须解析一种忽略缩进的语言的代
我是一名优秀的程序员,十分优秀!