简体   繁体   English

扁平化数组树js

[英]Flat an array tree js

Can you help me please to flat this tree?你能帮我把这棵树弄平吗? I have tried a few things and it didn't work.我已经尝试了几件事,但没有奏效。 I would like to get the fastest way(Algorithm).我想获得最快的方法(算法)。

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

This is result that i expect to have:这是我期望得到的结果:

  { 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' }
]```

You could take Array#flatMap and a callback which calls itself.您可以使用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; }

After fixing your syntax to be actually valid JavaScript, you'll need a recursive function:在将您的语法修复为实际有效的 JavaScript 之后,您将需要一个递归 function:

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);

outputs输出

[
  { 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' }
]

You could write an internal visit method to handle traversing the tree and adding items to an internal results list.您可以编写一个内部visit方法来处理遍历树并将项目添加到内部results列表。

Note: Make sure your JS/JSON data is structured correctly.注意:确保您的 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; }

 const flatten = (data) => data.map(({ children }) => ([...flatten(children)]));

Your current code does traverse the whole tree, but never actually extracts item from the data.您当前的代码确实遍历了整个树,但从未真正从数据中提取item Another issue is that you currently use map , which means the resulting value will always have the same amount of elements as the initial array.另一个问题是您当前使用map ,这意味着结果值将始终具有与初始数组相同数量的元素。 Use flatMap to increase or reduce the amount of elements in the array.使用flatMap增加或减少数组中的元素数量。

Changing your code as little as possible it might look like this:尽可能少地更改您的代码,它可能看起来像这样:

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));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM