【问题标题】:Flat an array tree js扁平化数组树js
【发布时间】:2021-03-29 09:48:01
【问题描述】:

你能帮我把这棵树弄平吗? 我已经尝试了几件事,但没有奏效。 我想得到最快的方法(算法)。

const source = [
  {
    item: { id: 1, name: "item name", code: "1d4g4" },
    children: [
      {
        item: { id: 2, name: "item name 2", code: "1d4g4" },
        children: [
          {
            item: { id: 2, name: "item name 2", code: "1d4g4" },
            children: [
              {
                item: { id: 3, name: "item name 2", code: "1d4g4" },
                children: [
                  { item: { id: 4, name: "item name 2", code: "1d4g4" }, children: [] },
                  { item: { id: 4, name: "item name 2", code: "1d4g4" }, children: [] },
                  { item: { id: 4, name: "item name 2", code: "1d4g4" }, children: [] },
                ],
              },
            ],
          },
        ],
      },
    ],
  },
];

这是我期望得到的结果:

  { id: 1, name: 'item name', code: '1d4g4' },
  { id: 2, name: 'item name 2', code: '1d4g4' },
  { id: 2, name: 'item name 2', code: '1d4g4' },
  { id: 3, name: 'item name 2', code: '1d4g4' },
  { id: 4, name: 'item name 2', code: '1d4g4' },
  { id: 4, name: 'item name 2', code: '1d4g4' },
  { id: 4, name: 'item name 2', code: '1d4g4' }
]```

【问题讨论】:

  • 如果您说您尝试过某事,您需要向我们展示您尝试过的内容。否则,您要求我们提供完整的解决方案。
  • “我已经尝试了一些东西” ~ 这些东西你都试过了吗?
  • 数组上有一个函数名为flatMap...
  • 您的来源不是有效的 JavaScript。
  • 提问时的绝对最低要求是发布可编译的数据。在您的数据中 children: [ 之后缺少 {} 括号。任何 IDE 都会突出显示这些错误。请通过发布有效的对象数组来创建minimal reproducible example

标签: javascript arrays flat


【解决方案1】:
const flatten = (data) => data.map(({ children }) => ([...flatten(children)]));

您当前的代码确实遍历了整个树,但从未真正从数据中提取item。另一个问题是您当前使用map,这意味着结果值将始终具有与初始数组相同数量的元素。使用flatMap 增加或减少数组中元素的数量。

尽可能少地更改您的代码,它可能看起来像这样:

const flatten = (data) => data.flatMap(({item, children}) => ([item, ...flatten(children)]));

const flatten = (data) => data.flatMap(({item, children}) => ([item, ...flatten(children)]));

const data = [{
  item: {id: 1, name: "item name", code: "1d4g4"},
  children: [{
    item: {id: 2, name: "item name 2", code: "1d4g4"},
    children: [{
      item: {id: 2, name: "item name 2", code: "1d4g4"},
      children: [{
        item: {id: 3, name: "item name 2", code: "1d4g4"},
        children:[
          {item: {id: 4, name: "item name 2", code: "1d4g4"}, children: []},
          {item: {id: 4, name: "item name 2", code: "1d4g4"}, children: []},
          {item: {id: 4, name: "item name 2", code: "1d4g4"}, children: []},
        ]
      }]
    }]
  }]
}];

console.log(flatten(data));

【讨论】:

    【解决方案2】:

    您可以使用Array#flatMap 和一个调用自身的回调。

    const
        flat = ({ item, children = [] }) => [item, ...children.flatMap(flat)],
        data = [{ item: { id: 1, name: "item name", code: "1d4g4" }, children: [{ item: { id: 2, name: "item name 2", code: "1d4g4" }, children: [{ item: { id: 2, name: "item name 2", code: "1d4g4" }, children: [{ item: { id: 3, name: "item name 2", code: "1d4g4" }, children: [{ item: { id: 4, name: "item name 2", code: "1d4g4" }, children: [] }, { item: { id: 4, name: "item name 2", code: "1d4g4" }, children: [] }, { item: { id: 4, name: "item name 2", code: "1d4g4" }, children: [] }] }] }] }] }],
        result = data.flatMap(flat);
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案3】:

      您可以编写一个内部 visit 方法来处理遍历树并将项目添加到内部 results 列表。

      注意:确保您的 JS/JSON 数据结构正确。

      const tree = [{
        item: {id: 1, name: "item name", code: "1d4g4"},
        children: [{
          item: {id: 2, name: "item name 2", code: "1d4g4"},
          children: [{
            item: {id: 2, name: "item name 2", code: "1d4g4"},
            children: [{
              item: {id: 3, name: "item name 2", code: "1d4g4"},
              children:[
                {item: {id: 4, name: "item name 2", code: "1d4g4"}, children: []},
                {item: {id: 4, name: "item name 2", code: "1d4g4"}, children: []},
                {item: {id: 4, name: "item name 2", code: "1d4g4"}, children: []},
              ]
            }]
          }]
        }]
      }];
      
      const treeToList = (tree, results = []) => {
        const visit = ({ item, children = [] }, res) => {
          if (item) res.push(item);
          children.forEach(child => visit(child, res));
        }
        visit({ children: tree }, results);
        return results;
      }
      
      console.log(treeToList(tree));
      .as-console-wrapper { top: 0; max-height: 100% !important; }

      【讨论】:

        【解决方案4】:

        在将语法修正为真正有效的 JavaScript 之后,您将需要一个递归函数:

        function flatten(destArray, nodeList) {
          nodeList.forEach((node) => {
            destArray.push(node.item);
            flatten(destArray, node.children || []);
          });
        }
        
        const source = [
          {
            item: { id: 1, name: "item name", code: "1d4g4" },
            children: [
              {
                item: { id: 2, name: "item name 2", code: "1d4g4" },
                children: [
                  {
                    item: { id: 2, name: "item name 2", code: "1d4g4" },
                    children: [
                      {
                        item: { id: 3, name: "item name 2", code: "1d4g4" },
                        children: [
                          { item: { id: 4, name: "item name 2", code: "1d4g4" }, children: [] },
                          { item: { id: 4, name: "item name 2", code: "1d4g4" }, children: [] },
                          { item: { id: 4, name: "item name 2", code: "1d4g4" }, children: [] },
                        ],
                      },
                    ],
                  },
                ],
              },
            ],
          },
        ];
        
        const dest = [];
        flatten(dest, source);
        console.log(dest);
        

        输出

        [
          { id: 1, name: 'item name', code: '1d4g4' },
          { id: 2, name: 'item name 2', code: '1d4g4' },
          { id: 2, name: 'item name 2', code: '1d4g4' },
          { id: 3, name: 'item name 2', code: '1d4g4' },
          { id: 4, name: 'item name 2', code: '1d4g4' },
          { id: 4, name: 'item name 2', code: '1d4g4' },
          { id: 4, name: 'item name 2', code: '1d4g4' }
        ]
        

        【讨论】:

        • 在我变坏之前就拥有它
        猜你喜欢
        • 1970-01-01
        • 2021-11-24
        • 2018-05-24
        • 1970-01-01
        • 2018-04-11
        • 2017-08-25
        • 1970-01-01
        • 2016-09-13
        相关资源
        最近更新 更多