Javascript 对树的偏移量

Javascript 对树的偏移量,javascript,algorithm,dom,data-structures,Javascript,Algorithm,Dom,Data Structures,所以我有一个数据结构,看起来像: { "text": "hello world!", "tags": [{"start": 0, "end": 4, "tag": "b"}, {"start": 1, "end": 5, "tag": "i"}] } 我想把它变成这样: [["b", [ ["#text", "h"], ["i", ["#text", "ello"]]]] ,["i", ["#text", " "]] ,["#text", "world!"]] (是的,这

所以我有一个数据结构,看起来像:

{
  "text": "hello world!",
  "tags": [{"start": 0, "end": 4, "tag": "b"}, {"start": 1, "end": 5, "tag": "i"}]
}
我想把它变成这样:

[["b", [
   ["#text", "h"],
   ["i", ["#text", "ello"]]]]
,["i", ["#text", " "]]
,["#text", "world!"]]
(是的,这是DOM树的一种抽象表示形式。)


我真的不确定什么是开始接近这个的正确方法。有什么想法吗?

也许添加新标签的方法将通过类似于深度优先搜索的过程来完成。最初,数据结构仅为单个叶节点:

[
    ["#text", "hello world!"]
]
添加第一个标记将把目前为止唯一的节点拆分为两个节点,其中一个节点具有标记“b”。实际上,正在添加一个新元素,并且唯一节点的字符串将被制作成原来的子字符串:

[
    ["b",
        ["#text", "hello"]
    ],
    ["#text", " world!"]
]
一般来说,叶节点包含原始文本的子字符串,非叶节点是标记。当添加另一个标记时,将执行深度优先搜索,同时保持到目前为止看到的子字符串的长度总和

当搜索在上述结构中输入“b”时,子字符串和长度将为0。添加该节点字符串(“hello”)的长度后,子字符串长度将变为5。由于“i”的范围与0-5重叠,“b”节点必须临时拆分,从而产生:

[
    ["b",
        ["#text", "h"],
        ["i",
            ["#text", "ello"]
        ]
    ],
    ["#text", " world!"]
]
[
    ["b",
        ["#text", "h"],
        ["i",
            ["#text", "ello"]
        ]
    ],
    ["i",
        ["#text", " "]
    ],
    ["#text", "world!"]
]
但是,“i”标记的深度优先搜索尚未完成,下一个节点(标记为“#text”)也必须拆分。当前子字符串长度在进入该节点时为5,在添加该节点的文本(“world!”)后将变为12。“i”在5-12范围内,这是分割节点的条件,产生:

[
    ["b",
        ["#text", "h"],
        ["i",
            ["#text", "ello"]
        ]
    ],
    ["#text", " world!"]
]
[
    ["b",
        ["#text", "h"],
        ["i",
            ["#text", "ello"]
        ]
    ],
    ["i",
        ["#text", " "]
    ],
    ["#text", "world!"]
]

请注意,括号与您在问题中发布的内容略有不同。我认为最初的括号问题(在评论中提到)不是最后一个括号

看起来您必须知道“I”部分包含在“b”中才能使用它?只是想弄明白为什么这可能是一个理想的东西是的,你知道从“开始”和“结束”偏移量(约束条件是0到4的文本必须是“b”的子文本,1到5的文本必须是“i”的子文本)。你的例子有不平衡的方括号,不清楚如何修复它,你能平衡一下然后再贴一次吗?只是缺少最后一个括号。请参见编辑。