我花了很长时间思考某个问题,但我找不到令人满意的解决方案,这对我来说是一个阻碍问题。
情况如下。
我正在编写一个管理动态树结构的小Javascript库(没有二进制文件),并且根/节点在json数组中表示为对象:
var json = [{ text: "root", children: [
{id: "id_1", text: "node_1", children:[
{id: "id_c1", text: "node_c1"},
{id: "id_c2", text: "node_c2", children: [
{id: "id_c2_c1", text: "node_c2_c1"},
{id: "id_c2_c2", text: "node_c2_c2"},
{id: "id_c2_c3", text: "node_c2_c3"}]},
{id: "id_c3", text: "node_c3"}]},
{id: "id_2", text: "node_2"}]}];
我有一些密切相关的问题(第一个是核心问题,其他问题是由它产生的):
最明显的解决方案是展平json数组并在每次操作时重新索引所有节点(这显然有效),但我相当确定这总体上是一个相当糟糕的想法(效率低下)。
我想出的另一个想法是将一定的重量归因于#34;基于算法(使用索引,级别等)到每个节点。但是,我无法找到计算体重的正确方法。而且,它没有解决问题,因为插入/删除随机节点似乎仍然需要重建索引。
以下是我当前的代码:https://gist.github.com/kimgysen/9d066bdf095b853c4d0e67517a76777d
对此事的任何帮助或意见将不胜感激......
注意:我不希望任何人通过整个代码,这更像是我一直困扰的概念性编程问题。如果有的话,我对概念解决方案感到满意。
答案 0 :(得分:0)
这是我的解决方案:
[ {id: "root", p_id: 0, l_id: 0, text: "website"},
{id: "header", p_id: "root", l_id: 0, text: "Parent: root, left: none"},
{id: "nav", p_id: "header", l_id: 0, text: "Parent: header, left:none"},
{id: "headline", p_id: "header", l_id: "nav", text: "Parent: header, left: nav"},
{id: "promotion", p_id: "header", l_id: "headline", text: "Parent: header, left: headline"},
];
插入节点
如果名为' new_node'的新节点需要在标题'之前插入。
{id: "new_node", p_id: , l_id: , text: "Parent:header, left:nav"},
更新标题'的标题的l_id。到' new_node'。
{id: "headline", p_id: "header", l_id: "new_node", text: "Parent: header, left: new_node"}
{id: "new_node", p_id: "header", l_id: "nav", text: "Parent: header, left: nav"},
删除节点
删除'标题'。
此解决方案源自" 层次结构类别模型",每个元素都可能有子项,子项可能会再次生成子项。除此之外,“父节点”中的每个元素都包含在内。需要知道他的直接兄弟姐妹。我认为这是一个"链接列表"结构体。
的幻灯片