Javascript a'的重组和清洁;treeview';JSON对象
我想创建一个JavaScript方法来转换Json“treeView”对象。我的起始对象具有具有重复分支的结构: 基础数据示例: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
- 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}
谢谢你,你的回答帮了我很大的忙!我真的很喜欢第二种解决方案。祝你度过愉快的一天!