使用javascript和es6功能压扁树

时间:2018-11-18 11:40:31

标签: javascript recursion ecmascript-6 flatten arrow-functions

我在es6中是新手,并且想要展平我的树对象。 (我正在使用回流-不是redux-但在回流中,变平状态也是个好主意)

api响应:

export const node = {
item: 1,
children: [
  {
    item: 2,
    children: [
      {
        item: 3,
        children: [
          {
            item: 4,
            children: []
          },
          {
            item: 5,
            children: []
          },
          {
            item: 6,
            children: [
              {
                item: 7,
                children: []
              },
              {
                item: 8,
                children: []
              },
              {
                item: 9,
                children: []
              }
            ]
          }
        ]
      },
      {
        item: 10,
        children: [
          {
            item: 11,
            children: []
          },
          {
            item: 12,
            children: [
              {
                item: 13,
                children: []
              },
              {
                item: 14,
                children: []
              }
            ]
          }
        ]
      }
    ]
  }
]

}

我的目标是:

 tree= { 
       byId: { 
        item1 : { 
            id: 'item1', 
            name: 'item1', parent: null, 
            children : ['item2']
        }
}

父级是一个ID,子级是ID数组

用于构建面包屑(使用父级)或列出子对象...

使用

从ID获取对象
tree.byId[someId]

我最后一次尝试将递归函数与es6传播算子一起使用:

const flattenTree = (tree, flattenTree) => {
    if (node.children.length) {

        node.children.map(child => {
            return flattenTree(child, [...tree= { id: child.item}])
        })

    } else {
        return [...tree, tree.byId[cat.item] = { id: cat.item, name: cat.item }]
    }
}

对不起,我是第一次来,所以我的帖子格式不正确...

寻求帮助

2 个答案:

答案 0 :(得分:0)

const tree = {
  item: 1,
  children: [
    {
      item: 2,
      children: [
        {
          item: 3,
          children: [
            {
              item: 4,
              children: []
            },
            {
              item: 5,
              children: []
            },
            {
              item: 6,
              children: [
                {
                  item: 7,
                  children: []
                },
                {
                  item: 8,
                  children: []
                },
                {
                  item: 9,
                  children: []
                }
              ]
            }
          ]
        },
        {
          item: 10,
          children: [
            {
              item: 11,
              children: []
            },
            {
              item: 12,
              children: [
                {
                  item: 13,
                  children: []
                },
                {
                  item: 14,
                  children: []
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}


const flattenTree = (tree) => {
  const newTree = { byId: {} };

  const traverseNode = (node, parent) => {
    const id = `item${node.item}`;
    newTree.byId[id] = {
      id,
      name: id,
      parent,
      children: node.children.map((c) => {
        traverseNode(c, id)
        return `item${c.item.id}`;
      })
    }
  }

  traverseNode(tree, null);
  return newTree;
}

flattenTree(tree)的结果看起来像这样:

{ byId:
   { item4:
      { id: 'item4', name: 'item4', parent: 'item3', children: [] },
     item5:
      { id: 'item5', name: 'item5', parent: 'item3', children: [] },
     item7:
      { id: 'item7', name: 'item7', parent: 'item6', children: [] },
     item8:
      { id: 'item8', name: 'item8', parent: 'item6', children: [] },
     item9:
      { id: 'item9', name: 'item9', parent: 'item6', children: [] },
     item6:
      { id: 'item6', name: 'item6', parent: 'item3', children: [Array] },
     item3:
      { id: 'item3', name: 'item3', parent: 'item2', children: [Array] },
     item11:
      { id: 'item11', name: 'item11', parent: 'item10', children: [] },
     item13:
      { id: 'item13', name: 'item13', parent: 'item12', children: [] },
     item14:
      { id: 'item14', name: 'item14', parent: 'item12', children: [] },
     item12:
      { id: 'item12',
        name: 'item12',
        parent: 'item10',
        children: [Array] },
     item10:
      { id: 'item10',
        name: 'item10',
        parent: 'item2',
        children: [Array] },
     item2:
      { id: 'item2', name: 'item2', parent: 'item1', children: [Array] },
     item1:
      { id: 'item1', name: 'item1', parent: null, children: [Array] } } }

答案 1 :(得分:0)

您可以使用此递归函数:

    Main() {
    let flattedTree = [];
    // We must treat the tree like a node, so we put it inside an array.
    let tree = [
      {
        item: 1,
        children: [
          {
            item: 2,
            children: [
              {
                item: 3,
                children: [
                  {
                    item: 4,
                    children: [],
                  },
                  {
                    item: 5,
                    children: [],
                  },
                  {
                    item: 6,
                    children: [
                      {
                        item: 7,
                        children: [],
                      },
                      {
                        item: 8,
                        children: [],
                      },
                      {
                        item: 9,
                        children: [],
                      },
                    ],
                  },
                ],
              },
              {
                item: 10,
                children: [
                  {
                    item: 11,
                    children: [],
                  },
                  {
                    item: 12,
                    children: [
                      {
                        item: 13,
                        children: [],
                      },
                      {
                        item: 14,
                        children: [],
                      },
                    ],
                  },
                ],
              },
            ],
          },
        ],
      },
    ];
    // After recursive method executed you will have a flattend array.
    // flattedTree variable hold the flatted tree.
    this.flatten(tree, flattedTree);
  }

  flatten(nodes: any[], flattedNodes: any[]) {
    for (let index = 0; index < nodes.length; index++) {
      flattedNodes.push(nodes[index]);
     if (nodes[index].children !== undefined)
      if (nodes[index].children.length > 0)
        this.flatten(nodes[index].children, flattedNodes);
    }
  }

这是结果:

[{"item":1,"children":[{"item":2,"children":[{"item":3,"children":[{"item":4,"children":[]},{"item":5,"children":[]},{"item":6,"children":[{"item":7,"children":[]},{"item":8,"children":[]},{"item":9,"children":[]}]}]},{"item":10,"children":[{"item":11,"children":[]},{"item":12,"children":[{"item":13,"children":[]},{"item":14,"children":[]}]}]}]}]},{"item":2,"children":[{"item":3,"children":[{"item":4,"children":[]},{"item":5,"children":[]},{"item":6,"children":[{"item":7,"children":[]},{"item":8,"children":[]},{"item":9,"children":[]}]}]},{"item":10,"children":[{"item":11,"children":[]},{"item":12,"children":[{"item":13,"children":[]},{"item":14,"children":[]}]}]}]},{"item":3,"children":[{"item":4,"children":[]},{"item":5,"children":[]},{"item":6,"children":[{"item":7,"children":[]},{"item":8,"children":[]},{"item":9,"children":[]}]}]},{"item":4,"children":[]},{"item":5,"children":[]},{"item":6,"children":[{"item":7,"children":[]},{"item":8,"children":[]},{"item":9,"children":[]}]},{"item":7,"children":[]},{"item":8,"children":[]},{"item":9,"children":[]},{"item":10,"children":[{"item":11,"children":[]},{"item":12,"children":[{"item":13,"children":[]},{"item":14,"children":[]}]}]},{"item":11,"children":[]},{"item":12,"children":[{"item":13,"children":[]},{"item":14,"children":[]}]},{"item":13,"children":[]},{"item":14,"children":[]}]