Javascript a'的重组和清洁;treeview';JSON对象

Javascript a'的重组和清洁;treeview';JSON对象,javascript,json,algorithm,Javascript,Json,Algorithm,我想创建一个JavaScript方法来转换Json“treeView”对象。我的起始对象具有具有重复分支的结构: 基础数据示例: - ROOT - 01 - 011 - 0111 - 01 - 011 - 0112 - 01 - 011 - 0113 - 01 - 012 - 0121 - 01

我想创建一个JavaScript方法来转换Json“treeView”对象。我的起始对象具有具有重复分支的结构:

基础数据示例:

- ROOT
    - 01
        - 011
            - 0111
    - 01
        - 011
            - 0112
    - 01
        - 011
            - 0113
    - 01
        - 012
            - 0121
    - 01
        - 012
            - 0122
    - 01
        - 012
            - 0123
    - 01
        - 013
            - 0131
    - 01
        - 013
            - 0132
    - 01
        - 013
            - 0133
- ROOT
    - 01
        - 011
            - 0111
            - 0112
            - 0113
        - 012
            - 0121
            - 0122
            - 0123
        - 013
            - 0131
            - 0132
            - 0133
[
  {
    "id": 0,
    "name": "ROOT",
    "children": [
      {
        "name": "01",
        "id": 3,
        "children": [
          {
            "name": "013",
            "id": 2,
            "children": [
              {
                "name": "0131",
                "id": 1
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 6,
        "children": [
          {
            "name": "011",
            "id": 5,
            "children": [
              {
                "name": "0112",
                "id": 4
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 9,
        "children": [
          {
            "name": "011",
            "id": 8,
            "children": [
              {
                "name": "0111",
                "id": 7
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 12,
        "children": [
          {
            "name": "013",
            "id": 11,
            "children": [
              {
                "name": "0132",
                "id": 10
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 15,
        "children": [
          {
            "name": "013",
            "id": 14,
            "children": [
              {
                "name": "0133",
                "id": 13
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 18,
        "children": [
          {
            "name": "011",
            "id": 17,
            "children": [
              {
                "name": "0113",
                "id": 16
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 21,
        "children": [
          {
            "name": "012",
            "id": 20,
            "children": [
              {
                "name": "0121",
                "id": 19,
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 24,
        "children": [
          {
            "name": "012",
            "id": 23,
            "children": [
              {
                "name": "0122",
                "id": 22
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 27,
        "children": [
          {
            "name": "012",
            "id": 26,
            "children": [
              {
                "name": "0123",
                "id": 25
              }
            ]
          }
        ]
      }
    ]
  }
]
[
  {
    "id": 0,
    "name": "ROOT",
    "children": [
      {
        "name": "01",
        "id": 3,
        "children": [
          {
            "name": "011",
            "id": 5,
            "children": [
              {
                "name": "0111",
                "id": 7
              },
              {
                "name": "0112",
                "id": 4
              },
              {
                "name": "0113",
                "id": 16
              }
            ]
          },
          {
            "name": "012",
            "id": 20,
            "children": [
              {
                "name": "0121",
                "id": 19,
              },
              {
                "name": "0122",
                "id": 22
              },
              {
                "name": "0123",
                "id": 25
              }
            ]
          },
          {
            "name": "013",
            "id": 2,
            "children": [
              {
                "name": "0131",
                "id": 1
              },
              {
                "name": "0132",
                "id": 10
              },
              {
                "name": "0133",
                "id": 13
              }
            ]
          }
        ]
      },
    ]
  }
]
我希望该方法使用相同的代码对所有级别进行分组。 并按字母顺序对项目进行排序

方法应返回的内容示例:

- ROOT
    - 01
        - 011
            - 0111
    - 01
        - 011
            - 0112
    - 01
        - 011
            - 0113
    - 01
        - 012
            - 0121
    - 01
        - 012
            - 0122
    - 01
        - 012
            - 0123
    - 01
        - 013
            - 0131
    - 01
        - 013
            - 0132
    - 01
        - 013
            - 0133
- ROOT
    - 01
        - 011
            - 0111
            - 0112
            - 0113
        - 012
            - 0121
            - 0122
            - 0123
        - 013
            - 0131
            - 0132
            - 0133
[
  {
    "id": 0,
    "name": "ROOT",
    "children": [
      {
        "name": "01",
        "id": 3,
        "children": [
          {
            "name": "013",
            "id": 2,
            "children": [
              {
                "name": "0131",
                "id": 1
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 6,
        "children": [
          {
            "name": "011",
            "id": 5,
            "children": [
              {
                "name": "0112",
                "id": 4
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 9,
        "children": [
          {
            "name": "011",
            "id": 8,
            "children": [
              {
                "name": "0111",
                "id": 7
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 12,
        "children": [
          {
            "name": "013",
            "id": 11,
            "children": [
              {
                "name": "0132",
                "id": 10
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 15,
        "children": [
          {
            "name": "013",
            "id": 14,
            "children": [
              {
                "name": "0133",
                "id": 13
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 18,
        "children": [
          {
            "name": "011",
            "id": 17,
            "children": [
              {
                "name": "0113",
                "id": 16
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 21,
        "children": [
          {
            "name": "012",
            "id": 20,
            "children": [
              {
                "name": "0121",
                "id": 19,
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 24,
        "children": [
          {
            "name": "012",
            "id": 23,
            "children": [
              {
                "name": "0122",
                "id": 22
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 27,
        "children": [
          {
            "name": "012",
            "id": 26,
            "children": [
              {
                "name": "0123",
                "id": 25
              }
            ]
          }
        ]
      }
    ]
  }
]
[
  {
    "id": 0,
    "name": "ROOT",
    "children": [
      {
        "name": "01",
        "id": 3,
        "children": [
          {
            "name": "011",
            "id": 5,
            "children": [
              {
                "name": "0111",
                "id": 7
              },
              {
                "name": "0112",
                "id": 4
              },
              {
                "name": "0113",
                "id": 16
              }
            ]
          },
          {
            "name": "012",
            "id": 20,
            "children": [
              {
                "name": "0121",
                "id": 19,
              },
              {
                "name": "0122",
                "id": 22
              },
              {
                "name": "0123",
                "id": 25
              }
            ]
          },
          {
            "name": "013",
            "id": 2,
            "children": [
              {
                "name": "0131",
                "id": 1
              },
              {
                "name": "0132",
                "id": 10
              },
              {
                "name": "0133",
                "id": 13
              }
            ]
          }
        ]
      },
    ]
  }
]
基本数据(Json)示例:

- ROOT
    - 01
        - 011
            - 0111
    - 01
        - 011
            - 0112
    - 01
        - 011
            - 0113
    - 01
        - 012
            - 0121
    - 01
        - 012
            - 0122
    - 01
        - 012
            - 0123
    - 01
        - 013
            - 0131
    - 01
        - 013
            - 0132
    - 01
        - 013
            - 0133
- ROOT
    - 01
        - 011
            - 0111
            - 0112
            - 0113
        - 012
            - 0121
            - 0122
            - 0123
        - 013
            - 0131
            - 0132
            - 0133
[
  {
    "id": 0,
    "name": "ROOT",
    "children": [
      {
        "name": "01",
        "id": 3,
        "children": [
          {
            "name": "013",
            "id": 2,
            "children": [
              {
                "name": "0131",
                "id": 1
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 6,
        "children": [
          {
            "name": "011",
            "id": 5,
            "children": [
              {
                "name": "0112",
                "id": 4
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 9,
        "children": [
          {
            "name": "011",
            "id": 8,
            "children": [
              {
                "name": "0111",
                "id": 7
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 12,
        "children": [
          {
            "name": "013",
            "id": 11,
            "children": [
              {
                "name": "0132",
                "id": 10
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 15,
        "children": [
          {
            "name": "013",
            "id": 14,
            "children": [
              {
                "name": "0133",
                "id": 13
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 18,
        "children": [
          {
            "name": "011",
            "id": 17,
            "children": [
              {
                "name": "0113",
                "id": 16
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 21,
        "children": [
          {
            "name": "012",
            "id": 20,
            "children": [
              {
                "name": "0121",
                "id": 19,
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 24,
        "children": [
          {
            "name": "012",
            "id": 23,
            "children": [
              {
                "name": "0122",
                "id": 22
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 27,
        "children": [
          {
            "name": "012",
            "id": 26,
            "children": [
              {
                "name": "0123",
                "id": 25
              }
            ]
          }
        ]
      }
    ]
  }
]
[
  {
    "id": 0,
    "name": "ROOT",
    "children": [
      {
        "name": "01",
        "id": 3,
        "children": [
          {
            "name": "011",
            "id": 5,
            "children": [
              {
                "name": "0111",
                "id": 7
              },
              {
                "name": "0112",
                "id": 4
              },
              {
                "name": "0113",
                "id": 16
              }
            ]
          },
          {
            "name": "012",
            "id": 20,
            "children": [
              {
                "name": "0121",
                "id": 19,
              },
              {
                "name": "0122",
                "id": 22
              },
              {
                "name": "0123",
                "id": 25
              }
            ]
          },
          {
            "name": "013",
            "id": 2,
            "children": [
              {
                "name": "0131",
                "id": 1
              },
              {
                "name": "0132",
                "id": 10
              },
              {
                "name": "0133",
                "id": 13
              }
            ]
          }
        ]
      },
    ]
  }
]
方法应返回的内容示例(json):

- ROOT
    - 01
        - 011
            - 0111
    - 01
        - 011
            - 0112
    - 01
        - 011
            - 0113
    - 01
        - 012
            - 0121
    - 01
        - 012
            - 0122
    - 01
        - 012
            - 0123
    - 01
        - 013
            - 0131
    - 01
        - 013
            - 0132
    - 01
        - 013
            - 0133
- ROOT
    - 01
        - 011
            - 0111
            - 0112
            - 0113
        - 012
            - 0121
            - 0122
            - 0123
        - 013
            - 0131
            - 0132
            - 0133
[
  {
    "id": 0,
    "name": "ROOT",
    "children": [
      {
        "name": "01",
        "id": 3,
        "children": [
          {
            "name": "013",
            "id": 2,
            "children": [
              {
                "name": "0131",
                "id": 1
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 6,
        "children": [
          {
            "name": "011",
            "id": 5,
            "children": [
              {
                "name": "0112",
                "id": 4
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 9,
        "children": [
          {
            "name": "011",
            "id": 8,
            "children": [
              {
                "name": "0111",
                "id": 7
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 12,
        "children": [
          {
            "name": "013",
            "id": 11,
            "children": [
              {
                "name": "0132",
                "id": 10
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 15,
        "children": [
          {
            "name": "013",
            "id": 14,
            "children": [
              {
                "name": "0133",
                "id": 13
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 18,
        "children": [
          {
            "name": "011",
            "id": 17,
            "children": [
              {
                "name": "0113",
                "id": 16
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 21,
        "children": [
          {
            "name": "012",
            "id": 20,
            "children": [
              {
                "name": "0121",
                "id": 19,
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 24,
        "children": [
          {
            "name": "012",
            "id": 23,
            "children": [
              {
                "name": "0122",
                "id": 22
              }
            ]
          }
        ]
      },
      {
        "name": "01",
        "id": 27,
        "children": [
          {
            "name": "012",
            "id": 26,
            "children": [
              {
                "name": "0123",
                "id": 25
              }
            ]
          }
        ]
      }
    ]
  }
]
[
  {
    "id": 0,
    "name": "ROOT",
    "children": [
      {
        "name": "01",
        "id": 3,
        "children": [
          {
            "name": "011",
            "id": 5,
            "children": [
              {
                "name": "0111",
                "id": 7
              },
              {
                "name": "0112",
                "id": 4
              },
              {
                "name": "0113",
                "id": 16
              }
            ]
          },
          {
            "name": "012",
            "id": 20,
            "children": [
              {
                "name": "0121",
                "id": 19,
              },
              {
                "name": "0122",
                "id": 22
              },
              {
                "name": "0123",
                "id": 25
              }
            ]
          },
          {
            "name": "013",
            "id": 2,
            "children": [
              {
                "name": "0131",
                "id": 1
              },
              {
                "name": "0132",
                "id": 10
              },
              {
                "name": "0133",
                "id": 13
              }
            ]
          }
        ]
      },
    ]
  }
]

我认为递归方法是最合适的,但我没有太多的想法。

您正在寻找的关键字可能是trie

但是如果没有太多的理论,我们就可以编写一些代码了

这个想法是把你的输出看作一棵树。< /P> 每当访问数据的子级时,如果该子级尚不存在,则在树中创建对应于该子级的节点

然后你的递归,很好,你只需要回到你的树状结构

const data=[{“id”:0,“name”:“ROOT”,“children”:[{“name”:“01”,“id”:3,“children”:[{“name”:“013”,“id”:2,“children”:[{“name”:“0131”,“id”:1}]}}}},{“name”:“01”,“id”:6,“children”:[{“name”:“011”,“id”:5,“children”:[{“name”:“0112”,“id”:“id”:4}}}}}}}}},{“name”:“01”,“id”:9,“children name”:“name”:“name”:“011”,“id”:8”,“children name”:“{“name”:“011”“id”:“011”,“id”:“id”:“}}:12,“儿童”:[{“姓名”:“013”,“id”:11,“儿童”:[{“姓名”:“0132”,“id”:10}]}],{“姓名”:“01”,“id”:15,“儿童”:[{“姓名”:“013”,“id”:14,“儿童”:[{“姓名”:“0133”,“id”:13}]}]},{“姓名”:“01”,“id”:18,“儿童”:[{“姓名”:“011”,“id”:17,“儿童”:[{“姓名”:“0113”,“id”:16}]}]},{“姓名”:“01”,“id”:21”,“儿童:[“姓名”:“姓名”:“12”,“id”:“儿童”:“姓名”:“{,“id”:19}]}},{“姓名”:“01”,“id”:24,“儿童”:[{“姓名”:“012”,“id”:23,“儿童”:[{“姓名”:“0122”,“id”:22}]}},{“姓名”:“01”,“id”:27,“儿童”:[{“姓名”:“012”,“id”:26,“儿童”:[{“姓名”:“0123”,“id”:25}]}]
const makeTree=root=>{
常量树=(三节点,节点)=>{
trieode.children=trieode.children | |【】
让trieodeChild=trieode.children.find(child=>child.name==node.name)
如果(!三分之一儿童){
TrineodeChild={name:node.name,id:node.id}
三元组。儿童。推送(三元组儿童)
}
如果(!node.children)返回
node.children.forEach(child=>toTree(trieodechild,child))
返回三元组
}
返回到树({},根)
}
控制台时间('a')
log(JSON.stringify(makeTree(数据[0]),null,2))

这里是一个使用

我们遍历树并记住我们看到的节点。如果我们遇到前面看到的节点,我们会将其子节点合并到前面看到的节点中,并删除节点本身

注意,由于我们必须以“删除安全”的顺序遍历树,所以会选择不同的ID

//const objectScan=require('object-scan');
const myTree=[{id:0,name:'ROOT',children:[{name:'01',id:3,children:[{name:'013',id:2,children:[{name:'0131',id:1}]}},{name:'01',id:6,children:[{name:'011 id:5,children name:'0112',id:4}]}}},{name:'01',id:9,children name:'011 id:8,children id:[{name:'0111',id:7}}},{name:'01',id:12,孩子:[{name:'013',id:11,孩子:[{name:'0132',id:10}]},{name:'01',id:15,孩子:[{name:'013',id:14,孩子:[{name:'0133',id:13}]},{name:'01',id:18,孩子:[{name:'011 id:17,孩子:[{name:'0113',id:16}]},{name:'01',id:21,孩子:[{name:'012',id:20,子项:[{name:'0121',id:19}]},{name:'01',id:24,子项:[{name:'012',id:23,子项:[{name:'0122',id:22}]},{name:'01',id:27,子项:[{name:'012 id:26,子项:[{name:'0123',id:25}]}];
常量重写=(树)=>{
const lookup=objectScan(['**(^children$)']{
useArraySelector:false,
filterFn:({parent,property,value,context})=>{
if(上下文中的value.name){
if(Array.isArray(value.children)){
if(!Array.isArray(上下文[value.name].children)){
上下文[value.name]。子项=[];
}
上下文[value.name].children.push(…value.children);
}
父。拼接(属性,1);
}否则{
上下文[value.name]=值;
}
}
})(树,{});
const cmpFn=(a,b)=>a.name.localeCompare(b.name);
Object.values(查找)
.filter((v)=>Array.isArray(v.children))
.forEach((v)=>v.children.sort());
树排序(cmpFn);
};
log(重写(myTree));
//=>未定义
console.log(myTree);
//=>[{id:0,name:'ROOT',children:[{name:'01',id:27,children:[{name:'012',id:26,children:[{name:'0123',id:25},{name:'0122',id:22},{name:'0121',id:19}},{name:'011 id:17,children:[{name:'0113',id:16},{name:'0111',id:7},{name:'0112',id:4},{name:'013',id:14,children{name:'0133',id:13},{name:'0132',id:10},{name:'0131',id:1}]}
。作为控制台包装{最大高度:100%!重要;顶部:0}

谢谢你,你的回答帮了我很大的忙!我真的很喜欢第二种解决方案。祝你度过愉快的一天!