Javascript嵌套树排名

时间:2016-05-13 06:23:41

标签: javascript arrays json algorithm tree

我花了很长时间思考某个问题,但我找不到令人满意的解决方案,这对我来说是一个阻碍问题。
情况如下。

我正在编写一个管理动态树结构的小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"}]}]; 

我有一些密切相关的问题(第一个是核心问题,其他问题是由它产生的):

  1. 似乎无法以直接的方式(从上到下)对节点进行排名。插入/删除节点将搞砸排名。
  2. 由于这个原因,当给出两个节点(开始/结束)时,我找不到实现间隔(节点数组)检索的好方法。这在树菜单上的shift-select范围内:
  3. enter image description here

    1. 另一个结果是,在进行随机选择并将它们添加到临时数组时,我无法维持节点的正确顺序(使用命令键 - 用于以与检索的顺序相同的顺序拖放)。由于我无法为节点分配排名,因此我无法维持其顺序。
    2. 最明显的解决方案是展平json数组并在每次操作时重新索引所有节点(这显然有效),但我相当确定这总体上是一个相当糟糕的想法(效率低下)。

      我想出的另一个想法是将一定的重量归因于#34;基于算法(使用索引,级别等)到每个节点。但是,我无法找到计算体重的正确方法。而且,它没有解决问题,因为插入/删除随机节点似乎仍然需要重建索引。

      以下是我当前的代码:https://gist.github.com/kimgysen/9d066bdf095b853c4d0e67517a76777d

      对此事的任何帮助或意见将不胜感激......

      注意:我不希望任何人通过整个代码,这更像是我一直困扰的概念性编程问题。如果有的话,我对概念解决方案感到满意。

1 个答案:

答案 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"},
  1. 找到ID为'标题'。
  2. 的元素
  3. 将其p_id和l_id复制到new_node。
  4. 更新标题'的标题的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"},
    
  5. 删除节点

    删除'标题'。

    1. 保存标题的l_id,然后删除该元素。
    2. 找到p_id所有的元素'标题',删除它们。
    3. 找到' l_id'是标题',将其l_id更改为标题&#39>。
    4. 此解决方案源自" 层次结构类别模型",每个元素都可能有子项,子项可能会再次生成子项。除此之外,“父节点”中的每个元素都包含在内。需要知道他的直接兄弟姐妹。我认为这是一个"链接列表"结构体。

      以下是hierarchical categories model

      的幻灯片