【发布时间】:2021-06-09 18:01:08
【问题描述】:
我有一个具有这种形状的数据结构:
[
{
a: "x",
val: [
{ b: "y1", val: [1, 2, 3] },
{ b: "y2", val: [4, 5, 6] },
],
},
];
一个具有 3 个级别的示例:
[
{
a: "x",
val: [
{ b: "y1", val: [
{c: "z1", val: [1, 2]}
] },
{ b: "y2", val: [
{ c: "z2", val: [3, 4] },
{ c: "z3", val: [5, 6, 7] },
{ c: "z4", val: [8] }
] },
],
},
];
每个对象总是有相同级别的嵌套,并且我提前知道了最大嵌套深度。我们也提前知道了键的名称:我们知道级别 1 的键将命名为 a,级别 2 的键将命名为 b,以此类推。
我正在寻找将第一个示例转换为的函数:
[
{
a: "x",
b: "y1",
val: [1, 2, 3],
},
{
a: "x",
b: "y2",
val: [4, 5, 6],
},
];
也就是说,一个平面数组,其值和键从父级继承。
我有一个适用于第一个示例的解决方案:
const res = [
{
a: "x",
val: [
{ b: "y1", val: [1, 2, 3] },
{ b: "y2", val: [4, 5, 6] },
],
},
].flatMap((x) => x.val.flatMap((d) => ({ a: x.a, ...d })));
console.log(res);
但我正在努力将其变成递归函数。
提前感谢您的帮助!
【问题讨论】:
-
是否保证 values 对象不会是数字和对象的混合,例如:
values: [ {b: "y1", values: [1, 2, 3]}, 1, 2, 3 ]或者如果不是,您在这种情况下会做什么? -
每个对象只有一个数组吗?
-
@AbirTaheer 是的,它们不会是混合的。我在每个对象中也只有一个数组。
标签: javascript arrays recursion flatten