将层次数组转换为平面数组

Posted

技术标签:

【中文标题】将层次数组转换为平面数组【英文标题】:Generify transformation of hierarchical array into a flat array 【发布时间】:2020-05-22 08:24:02 【问题描述】:

我正在尝试将分层数组转换为平面数组。 我有这种对象,它有相同类型的孩子,有相同类型的孩子等等。

[
        id: "123",
        children: [
            
                id: "603",
                children: [
                    
                        id: "684",
                        children: [
                            ...
                        ]
                    ,
                    
                        id: "456",
                        children: []
                    
                ]
            
        ]
    ]

我找到了一种将其展平的方法,并且我有嵌套级别数的信息。 一层深(有效):

let result = myArray.flat()
            .concat(myArray.flatMap(comm => comm.children));

两层深(有效):

 let result = myArray.flat()
            .concat(myArray.flatMap(comm => comm.children))
            .concat(myArray.flatMap(comm => comm.children.flatMap(comm2 => comm2.children)));

但是我怎样才能在一个函数中生成这个代码来处理任何深度?我已经尝试过了,但它不起作用:

  flatFunct = (myArray, deep) => 
        let func = comm => comm.children;
        let flatMapResult = myArray.flat();
        for (let i = 0; i < deep; i++) 
            flatMapResult = flatMapResult.concat(() => 
                let result = myArray;
                for (let j = 0; j < i; j++) 
                   result = result.flatMap(func);
                
            );
        
    ;

我很近,但我找不到路。

【问题讨论】:

声明一个函数并递归调用它? 肯定,但我不明白 类似这样的东西:function flatter(arr) arr.flat().concat(arr.flatMap(comm =&gt; comm.children)); flatter(arr); ) 但你必须检查每个递归是否有更多的孩子 【参考方案1】:

您可以将Array#flatMap 与对象扁平子项一起使用。

const
    flat = ( children = [], ...o ) => [o, ...children.flatMap(flat)],
    data = [ id: "123", children: [ id: "603", children: [ id: "684", children: [ id: "688", children: [] ] ,  id: "456", children: [] ] ] ],
    result = data.flatMap(flat);

console.log(result);
.as-console-wrapper  max-height: 100% !important; top: 0; 

【讨论】:

这是对象的其余部分,没有children 属性。否则你会把孩子们留在扁平物体中。【参考方案2】:
const flat = arr => arr.concat(arr.flatMap(it => flat(it.children)));

【讨论】:

以上是关于将层次数组转换为平面数组的主要内容,如果未能解决你的问题,请参考以下文章

将平面数组转换为分层的多维数组

将位图数组转换为 YUV(420 平面)?

将嵌套的 mongoDB 文档转换为平面 pandas DataFrame(对象数组中的对象数组)

将分层平面数据(带 ParentID)转换为带缩进级别的排序平面列表的算法

根据内部元素的 ID 将平面 xml 转换为树层次结构

使用jolt变换并将平面json转换为复杂的嵌套json数组