通过引用父对象从对象数组创建对象

时间:2013-07-07 09:39:44

标签: javascript

对不起令人困惑的标题...我不知道更好的夏日。

我有一个对象数组。其中一些对象引用了它的父对象。这样的事情:

data: 
[
  {id: 2, parent: 1},
  {id: 1},
  {id: 3, parent: 1},
  {id: 5, parent: 3},
  {id: 4, parent: 3},
  {id: 6, parent: 2} 

]

我想要做的是从这个数组中创建一个Object,其中子对象嵌套在父对象中。像那样:

data: {
  id: 1,
  children: [
    {
      id:2,
      children: [
        {id: 6}
      ]
    },
    {
      id:3,
      children: [
        {id: 4},
        {id: 5}
      ]
    }
  ]
}

有谁知道这样做的聪明方法? 我知道我必须通过这个数组的每个对象来检查并检查是否有父对象。但是我怎样才能真正创建这个对象?

1 个答案:

答案 0 :(得分:2)

不确定这是最好的方法,但至少它是一种方法。

  1. 首先循环节点:
    • 将节点放在查询表中idnodes)。
    • 找到root节点(没有parent的单个节点)。
  2. 第二个循环(查找表完成):
    • 检查node是否有parent(除root以外的每个节点都为真。)
    • 通过在查找表中查找id来获取parent节点。
    • 获取parent.children数组,或者如果它尚不存在则创建它。
    • 将此node添加到该阵列。
    • 删除此parent的{​​{1}}属性。
  3. 请注意,这会更改node对象中的原始节点对象。这是故意的,因为树是通过存储对父节点中其他节点的引用来构建的。如果需要保持data中的原始节点不变,则应在构建查找表时克隆节点对象。例如,您可以在查找data循环中添加node = $.extend({}, node);作为第一行(使用jQuery时)。

    这是一个实现和demonstration

    forEach