在JavaScript中创建多个分支数组的最佳方法

在JavaScript中创建多个分支数组的最佳方法,javascript,arrays,Javascript,Arrays,我可以写速记对象,但之后我会有大量其他数组和对象的缩进。这是一个问题的形式,有许多分支新的问题集的基础上,最后一个回答。关于如何设计此代码有什么建议吗?使用如下树状结构: var n0 = {/*data*/}, n1 = {/*data*/}, ... n3234 = {/*data*/} n0.children = [n1, n2, n3] n1.children = [n11, n12, n13] ... n3234.children = [] n2222 = n2, ... n1111

我可以写速记对象,但之后我会有大量其他数组和对象的缩进。这是一个问题的形式,有许多分支新的问题集的基础上,最后一个回答。关于如何设计此代码有什么建议吗?

使用如下树状结构:

var
n0 = {/*data*/},
n1 = {/*data*/},
...
n3234 = {/*data*/}
n0.children = [n1, n2, n3]
n1.children = [n11, n12, n13]
...
n3234.children = []
n2222 = n2,
...
n1111.children = [n1]
如果重用子树,只需执行以下操作:

n2321 = n1234,
避免这样的循环:

var
n0 = {/*data*/},
n1 = {/*data*/},
...
n3234 = {/*data*/}
n0.children = [n1, n2, n3]
n1.children = [n11, n12, n13]
...
n3234.children = []
n2222 = n2,
...
n1111.children = [n1]

使用如下树结构:

var
n0 = {/*data*/},
n1 = {/*data*/},
...
n3234 = {/*data*/}
n0.children = [n1, n2, n3]
n1.children = [n11, n12, n13]
...
n3234.children = []
n2222 = n2,
...
n1111.children = [n1]
如果重用子树,只需执行以下操作:

n2321 = n1234,
避免这样的循环:

var
n0 = {/*data*/},
n1 = {/*data*/},
...
n3234 = {/*data*/}
n0.children = [n1, n2, n3]
n1.children = [n11, n12, n13]
...
n3234.children = []
n2222 = n2,
...
n1111.children = [n1]

其他类型较少的解决方案:

var d = {
'':  {/*data*/},
'1': {/*data*/},
'1.1': {/*data*/},
..
'3.2.3.4': {/*data*/}
}
for(var k in d){//init child array
  d[k].children = []
}
for(var k in d){//build tree structure
  if(k != ''){//skip root
    var a = k.split('.')//hierarchy array
    var i = a.pop()//remove my level
    var parent = a.join('.')
    if(parent in d){//parent exists
      d[parent].children.push({i: +i, k: k})//to prevent holes
    }
    else {
      console.log('pending subtree: ' + k)
    }
  }
}
for(var k in d){//transform child array
  d[k].children = d[k].children
    .sort(function(a, b){return a.i - b.i})//es6 (a, b)=>a.i-b.i
    .map(function(x){return d[x.k]})//es6 x=>d[x.k]
}
//now the tree is in d['']

其他类型较少的解决方案:

var d = {
'':  {/*data*/},
'1': {/*data*/},
'1.1': {/*data*/},
..
'3.2.3.4': {/*data*/}
}
for(var k in d){//init child array
  d[k].children = []
}
for(var k in d){//build tree structure
  if(k != ''){//skip root
    var a = k.split('.')//hierarchy array
    var i = a.pop()//remove my level
    var parent = a.join('.')
    if(parent in d){//parent exists
      d[parent].children.push({i: +i, k: k})//to prevent holes
    }
    else {
      console.log('pending subtree: ' + k)
    }
  }
}
for(var k in d){//transform child array
  d[k].children = d[k].children
    .sort(function(a, b){return a.i - b.i})//es6 (a, b)=>a.i-b.i
    .map(function(x){return d[x.k]})//es6 x=>d[x.k]
}
//now the tree is in d['']

重要的是数据的布局方式。如果根据前面的答案,所有问题都是唯一的,那么除了最初的建议之外,你没有太多的选择。如果一些问题导致相同的路径,那么您将需要更复杂的数据结构,例如有向图。但堆栈溢出并不是真正用于头脑风暴数据结构,而是用于解决严格定义的问题。研究有向图和图构造。这基本上就是你正在做的。重要的是数据是如何布局的。如果根据前面的答案,所有问题都是唯一的,那么除了最初的建议之外,你没有太多的选择。如果一些问题导致相同的路径,那么您将需要更复杂的数据结构,例如有向图。但堆栈溢出并不是真正用于头脑风暴数据结构,而是用于解决严格定义的问题。研究有向图和图构造。这基本上就是你所做的。关于你的例子,我不明白的一点是,它列出了尚未定义的子项。关于你的例子,我不明白的一点是,它列出了尚未定义的子项。在防空洞方面有一个错误。(undefined不是对象(计算'd[parent].children.push'))。应该放什么?添加了@child数组初始化并更正了连接。这不是一个经过测试的代码,你必须自己完成它…在防空洞上有一个错误。(undefined不是对象(计算'd[parent].children.push'))。应该放什么?添加了@child数组初始化并更正了连接。这不是一个经过测试的代码,你必须自己完成它。。。