我有一个嵌套的对象,我想将其展平/映射为一个单层的,类似表格的对象。
[{
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
部分,但我不知道如何将a
和b
映射到此对象,则它可以工作。
由于有些人要求提供一些有效的代码,因此应该这样做(未经测试):
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循环变得非常混乱。
您可以在属性'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);
flatMap
解决方案如下所示:
const result = myObj.flatMap(outer =>
outer.c.map(inner =>
({a: outer.a, b: outer.b, x: inner.x, y: inner.y})
)
);
当然,如果您的对象有多层,而不仅仅是两层,甚至有多层或未知的具有此类嵌套的属性,则应尝试实现递归解决方案。或者是一种迭代的方法,在该方法中,您遍历一组属性名称(对于您的示例情况为["c"]
),然后逐级应用展平化。