平面嵌套Javascipt对象

问题描述 投票:2回答:2

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

[{
    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循环变得非常混乱。

javascript flatmap
2个回答
1
投票

您可以在属性'c'上与flatMap一起使用map方法:

var input = [{ 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 }] }];

const output = input.flatMap(obj =>
  obj.c.map(arr => ({a: obj.a, b: obj.b, x: arr.x, y: arr.y}))
);

console.log(output);

-1
投票

flatMap解决方案如下所示:

const result = myObj.flatMap(outer =>
  outer.c.map(inner =>
    ({a: outer.a, b: outer.b, x: inner.x, y: inner.y})
  )
);

当然,如果您的对象有多层,而不仅仅是两层,甚至有多层或未知的具有此类嵌套的属性,则应尝试实现递归解决方案。或者是一种迭代的方法,在该方法中,您遍历一组属性名称(对于您的示例情况为["c"]),然后逐级应用展平化。

© www.soinside.com 2019 - 2024. All rights reserved.