问题描述
[
{
a: "x",val: [
{ b: "y1",val: [1,2,3] },{ b: "y2",val: [4,5,6] },],},];
3 个级别的示例:
[
{
a: "x",val: [
{c: "z1",2]}
] },val: [
{ c: "z2",val: [3,4] },{ c: "z3",val: [5,6,7] },{ c: "z4",val: [8] }
] },];
每个对象总是有相同级别的嵌套,我提前知道最大嵌套深度。我们也提前知道键的名称:我们知道级别 1 的键将命名为 a,级别 2 的键将命名为 b,依此类推。
[
{
a: "x",b: "y1",3],{
a: "x",b: "y2",6],];
即一个平面数组,其值和键从父级继承。
const res = [
{
a: "x",].flatMap((x) => x.val.flatMap((d) => ({ a: x.a,...d })));
console.log(res);
预先感谢您的帮助!
解决方法
您可以查看数组,如果里面没有对象返回一个对象,则通过存储其他属性来映射 val
属性。
const
isObject = o => o && typeof o === 'object',flat = array => {
if (!array.every(isObject)) return { val: array };
return array.flatMap(({ val,...o }) => {
const temp = flat(val);
return Array.isArray(temp)
? temp.map(t => ({ ...o,...t }))
: { ...o,...temp };
});
},data0 = [{ a: "x",val: [{ b: "y1",val: [1,2,3] },{ b: "y2",val: [4,5,6] }] }],data1 = [{ a: "x",val: [{ c: "z1",2] }] },val: [{ c: "z2",val: [3,4] },{ c: "z3",val: [5,6,7] },{ c: "z4",val: [8] }] }] }];
console.log(flat(data0));
console.log(flat(data1))
.as-console-wrapper { max-height: 100% !important; top: 0; }