Javascript 从js数组创建树

Javascript 从js数组创建树,javascript,java,tree,Javascript,Java,Tree,我正在尝试从列表中创建树。我的数据是这样的 A-->B-->C-->D-->E.. A-->B-->C-->D-->F.. A-->F-->C-->D-->E.. . . . 我在数组中有所有可能的数据路径。我想这样显示 A -B -C

我正在尝试从列表中创建树。我的数据是这样的

A-->B-->C-->D-->E..
A-->B-->C-->D-->F..
A-->F-->C-->D-->E..
.
.
.
我在数组中有所有可能的数据路径。我想这样显示

                     A
                       -B
                         -C
                           -D 
                              -E
                              -F
                       -F
                         -C
                           -D
                             -E 
如何使用javascript创建和检查?我需要createTreeFunction:)


基本上,您可以为子级使用至少两种不同的结构来构建树,一种是带有数组的结构(解决方案a),另一种是带有对象的结构(解决方案B)

数组相对于对象的优点是直接迭代子对象。对于一个对象,您需要先获取关键点,然后才能进行迭代

否则,如果您认识一个孩子,那么通过密钥进行访问会更快。在树中插入新节点时也是如此

对于子数组,您需要一个函数
getChild
,用于测试是否存在子数组

请注意,提供的数据不会保持标识符的唯一性

解决方案A带有子阵列:

功能节点(id){
this.id=id;
this.children=[];//数组
}
Node.prototype.getChild=函数(id){
var节点;
this.children.some(函数(n){
如果(n.id==id){
节点=n;
返回true;
}
});
返回节点;
};
变量路径=['A-->B-->C-->D-->E','A-->B-->C-->D-->F','A-->F-->C-->D-->E'],
树=新节点(“根”);
path.forEach(函数(a){
var parts=a.split('-->');
部分。减少(功能(r,b){
var节点=r.getChild(b);
如果(!节点){
节点=新节点(b);
r、 推送(节点);
}
返回节点;
},树木);
});
document.getElementById('out').innerHTML=JSON.stringify(树,0,4)

对于这个用例,我发明了非常有用的两种对象方法;即
Object.prototype.getNestedValue()
Object.prototype.setNestedValue()
。通过使用这些方法,这项工作只不过是一个单行JS代码。见下文

Object.prototype.getNestedValue=函数(…a){
返回a.length>1?(this[a[0]!==void 0和this[a[0]]。getNestedValue(…a.slice(1)):this[a[0]];
};
Object.prototype.setNestedValue=函数(…a){
返回a.length>2?此[a[0]==“对象”&此[a[0]!==null?此[a[0]]。setNestedValue(…a.slice(1))
:(此[a[0]]=a[1]==“字符串”?{}:新数组(a[1]),的类型,
此[a[0]].setNestedValue(…a.slice(1)))
:此[a[0]]=a[1];
};
var data=“A-->B-->C-->D-->E\nA-->B-->C-->D-->F\nA-->F-->C-->D-->E”,
datarr=data.split(“\n”).map(e=>e.split(“-->)”),//在数组中获取列表
o={};
datarr.forEach(a=>!o.getNestedValue(…a)和&o.setNestedValue(…a,null));

log(JSON.stringify(o,null,2))Javascript!=请提供一些非无效的数据(按树),或者创建一个循环。请使用唯一标识符。我发现您对
console.log()
不满意,并开始对嵌套的东西使用更酷的显示方法。(+)用于您的解决方案。@Redu,是的,该区域太小,无法显示更大的数据结构。
function parseData(data)
  {


   $.each(data, function (i, p) {
                   var arr = p.split("--->");

                 createTreeFunction(p);

                  });

   };
  function parseData(data)
      {


       $.each(data, function (i, p) {
                       var arr = p.split("--->");

                     createTreeFunction(p);

                      });

   };