【问题标题】:Converting flat array of object to array of nested objects [duplicate]将平面对象数组转换为嵌套对象数组[重复]
【发布时间】:2021-06-10 08:02:42
【问题描述】:

我正在尝试将来自我的数据库的平面对象数组转换为需要嵌套结构才能管理可扩展子行的 react-table。

我制作了一个非常不言自明的 CodeSandbox:

https://codesandbox.io/s/tender-chatterjee-kdssi?file=/src/App.js

基本上,我的原始数据结构如下:

  [
    {
      code: "A0",
      parent: ""
    },
    {
      code: "A01",
      parent: "A0"
    },
    {
      code: "A011",
      parent: "A01"
    },
    {
      code: "B0",
      parent: ""
    },
    {
      code: "B01",
      parent: "B0"
    },
    {
      code: "B011",
      parent: "B01"
    }
  ]

我想把它转换成这个结构:

  [
    {
      code: "A0",
      parent: "",
      subRows: [
        {
          code: "A01",
          parent: "A0",
          subRows: [
            {
              code: "A011",
              parent: "A01"
            }
          ]
        }
      ]
    },
    {
      code: "B0",
      parent: "",
      subRows: [
        {
          code: "B01",
          parent: "B0",
          subRows: [
            {
              code: "B011",
              parent: "B01"
            }
          ]
        }
      ]
    }
  ]

我尝试了一些递归方法,但他们留下了一些选择,所以我很乐意接受一些帮助。

谢谢。

【问题讨论】:

    标签: javascript reactjs ecmascript-6


    【解决方案1】:

    这可以通过一个相当简单的递归方法来完成。

    const mockData = [{
        code: "A0",
        parent: ""
      },
      {
        code: "A01",
        parent: "A0"
      },
      {
        code: "A011",
        parent: "A01"
      },
      {
        code: "B0",
        parent: ""
      },
      {
        code: "B01",
        parent: "B0"
      },
      {
        code: "B011",
        parent: "B01"
      }
    ];
    
    
    const hierarchize = (parent, list) => {
      const children = list.filter(x => x.parent == parent.code);
      children.forEach(child => hierarchize(child, list));
      parent.subRows = children;
    }
    
    const topLevel = mockData.filter(x => x.parent == "");
    topLevel.forEach(top => hierarchize(top, mockData));
    
    console.log(topLevel);

    【讨论】:

    • 有那么糟糕吗?我的问题由于重复而被关闭,但原始主题中的答案都没有这个 IMO 好和简单。除非它们已经排序,否则第一个和接受的答案不起作用。当原生 JS 现在完全能够做到这一点时,第二个使用外部库(下划线)。
    • @RebootGG 不,不是。确实这个问题已经被问了数百次了,但是有些人只是痴迷于链接(有点)重复而不是花 2 分钟来编写一些代码。我喜欢编写代码,而不喜欢找到(有点)重复。很高兴能帮到你。
    【解决方案2】:

    我认为 React 可以使用 rxjs 对吗??? 我认为 groupBy 会在这方面做得很好。 https://www.learnrxjs.io/learn-rxjs/operators/transformation/groupby

    【讨论】:

    • 请参阅this question,了解为什么仅链接的答案被认为是不好的。
    • 我想要一个无需加载外部库的解决方案,但我会看看,谢谢
    猜你喜欢
    • 2020-01-15
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2019-12-02
    相关资源
    最近更新 更多