将层次数组转换为平面数组
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 => 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)));
【讨论】:
以上是关于将层次数组转换为平面数组的主要内容,如果未能解决你的问题,请参考以下文章
将嵌套的 mongoDB 文档转换为平面 pandas DataFrame(对象数组中的对象数组)