【问题标题】:flatten tree with javascript and es6 features使用 javascript 和 es6 功能展平树
【发布时间】:2019-04-20 23:25:54
【问题描述】:

我是 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']
        }
}

parent 是一个 id,childrend 是 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 }]
    }
}

对不起,我是第一次来这里,所以我的帖子格式不太好......

感谢帮助

【问题讨论】:

  • 您希望所有 id 都位于根目录,例如 tree : { byId: { item1: {...}, item2: {...}, item3: {...}, .... , item14:{...}}}?

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


【解决方案1】:
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] } } }

【讨论】:

    【解决方案2】:

    你可以使用这个递归函数:

        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":[]}]
    

    【讨论】:

      猜你喜欢
      • 2020-04-28
      • 2016-02-26
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多