我正在尝试在JavaScript中扩展数组。object↓
const tests = [
{
id: 1,
name: 'taro',
designs: [
{
designId: 1,
designName: "design1"
},
{
designId: 2,
designName: "design2"
}
]
},
{
id: 2,
name: 'John',
designs: [
{
designId: 3,
designName: "design3"
},
{
designId: 4,
designName: "design4"
}
]
},
{
id: 3,
name: 'Lisa',
designs: []
},
];[
{ id: 1, name: 'taro', designId: 1, designName: 'design1' },
{ id: 1, name: 'taro', designId: 2, designName: 'design2' },
{ id: 2, name: 'John', designId: 3, designName: 'design3' },
{ id: 2, name: 'John', designId: 4, designName: 'design4' },
{ id: 3, name: 'Lisa', designId: null, designName: null },
]使用double for很容易做到这一点,但我想将其用于高阶函数。
我写的代码
for (let i = 0; i < tests.length; i++) {
for (let j = 0; j < tests[i].designs.length; j++) {
const id = tests[i].id
const name = tests[i].name
result.push({
id,
name,
designId: tests[i].designs[j].designId,
designName: tests[i].designs[j].designName
})
}
}此外,如果您能另外解释double for函数和高阶函数之间的性能差异,将不胜感激。
发布于 2021-09-27 05:58:08
您可以在测试数组上使用.flatMap(),每个designs数组上都有一个内部.map()。设计数组上的内部映射将从当前迭代的设计对象中获取属性,并将其与父对象中的属性合并。然后可以使用外部.flatMap()将所有返回的映射连接到一个数组中:
const tests = [ { id: 1, name: 'taro', designs: [ { designId: 1, designName: "design1" }, { designId: 2, designName: "design2" } ] }, { id: 2, name: 'John', designs: [ { designId: 3, designName: "design3" }, { designId: 4, designName: "design4" } ] }, ];
const res = tests.flatMap(({designs, ...rest}) => designs.map(design => ({
...rest,
...design
})));
console.log(res);
编辑:如果在设计数组为空的情况下需要为设计对象显示null值,则可以将键显式添加到新对象中,该对象可以在设计数组为空时返回:
const tests = [ { id: 1, name: 'taro', designs: [] }, { id: 2, name: 'John', designs: [] }, ];
const res = tests.flatMap(({designs, ...rest}) =>
designs.length
? designs.map(design => ({
...rest,
...design
}))
: {...rest, designId: null, designName: null}
);
console.log(res);
发布于 2021-09-27 05:57:33
您可以使用带有Array.map的Array.reduce函数来生成数组:
const results = tests.reduce((acc, { designs, ...rest }) => [
...acc,
...designs.map(e => ({ ...rest, ...e }))
], []);
const tests = [
{
id: 1,
name: 'taro',
designs: [
{
designId: 1,
designName: "design1"
},
{
designId: 2,
designName: "design2"
}
]
},
{
id: 2,
name: 'John',
designs: [
{
designId: 3,
designName: "design3"
},
{
designId: 4,
designName: "design4"
}
]
},
];
const results = tests.reduce((acc, { designs, ...rest }) => [
...acc,
...designs.map(e => ({ ...rest, ...e }))
], []);
console.log(results);
发布于 2021-09-27 06:42:01
您可以在Array.prototype.map()中使用高阶函数Array.prototype.reduce()
const newArr = tests.reduce((prev, {designs, ...current}) => [
...prev, ...designs.map(design => ({...design,...current}));
]
, []);您的方法和这种高阶方法的性能是相同的,因为Array.prototype.reduce遍历整个数组,只是简化了我们的initialValue方法。
https://stackoverflow.com/questions/69341748
复制相似问题