我有一个嵌套对象,我想将它展平/映射到一个单层的、类似表格的对象中。

[{
    a: 1,
    b: 2,
    c: [{
        x: 10,
        y: 20
    }, {
        x: 30,
        y: 40
    }]
}, {
    a: 3,
    b: 4,
    c: [{
        x: 50,
        y: 60
    }, {
        x: 70,
        y: 80
    }]
}]

从那以后,我想得到这样的东西:

[{
    a: 1,
    b: 2,
    x: 10,
    y: 20
}, {
    a: 1,
    b: 2,
    x: 30,
    y: 40
}, {
    a: 3,
    b: 4,
    x: 50,
    y: 60
}, {
    a: 3,
    b: 4,
    x: 70,
    y: 80
}]

当然,我可以简单地用两个 for 循环遍历对象并将结果信息放在一个单独的数组中,但我想知道是否有更简单的解决方案。我已经尝试过使用 flatMap 。它有效,如果我只想要嵌套对象的 c 部分,但我不知道如何将 ab 映射到这个对象。

正如你们中的一些人要求提供一些工作代码,这应该可以做到(未经测试):

let result = [];

for (const outer of myObj)
  for (const inner of outer.c)
    result.push({a: outer.a, b: outer.b, x: inner.x, y: inner.y});

问题是,是否有一种功能性的单线或什至另一种更好的方法。实际上,我的对象由四层组成,嵌套的 for 循环很快就会变得困惑。

最佳答案

理想情况下,解决方案需要一些东西来说明开始将对象归类为完整对象的程度,一个简单的解决方案就是通过您想要的级别。如果您不想通过级别,您可以进行检查,如果没有任何属性具有数组,那么您会将其归类为完整记录,但当然该逻辑是您需要确认的。

如果您想要一个适用于多个级别的通用版本,如果您通过级别并使用递归,您可以执行以下操作 ->

const a=[{a:1,b:2,c:[{x:10,y:20},{x:30,y:40}]},{a:3,b:4,c:[{x:50,y:60},{x:70,y:80}]}];


function flattern(a, lvl) {
  const r = [];
  function flat(a, l, o) {
    for (const aa of a) {
      o = {...o};
      for (const [k, v] of Object.entries(aa)) {
        if (Array.isArray(v) && l < lvl) flat(v, l + 1, o);
        else o[k] = v;
      }
      if (l === lvl) r.push(o);
    }
  }
  flat(a, 1);
  return r;
}

console.log(flattern(a, 2));
//console.log(flattern(a, 1));

10-07 19:18
查看更多