【问题标题】:How to expand an object in an array in JavaScirpt如何在 JavaScript 中扩展数组中的对象
【发布时间】:2021-09-27 05:48:58
【问题描述】:

我正在尝试在 JavaScript 中扩展数组。 对象↓

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 和高阶函数之间的性能差异,我们将不胜感激。

【问题讨论】:

标签: javascript arrays object higher-order-functions


【解决方案1】:

您可以在测试数组上使用.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);

【讨论】:

  • 啊... flatMap,确实更好
  • @Nick 我想用 null 填充 designId 和 designName,即使 mojidesigns 是一个空数组。 [{ id: 1, name: 'taro', designs: [] } ] → [{ id: 1, name: 'taro', designId: null, designName: null }]
  • @Lana2548 你可以检查一个空的designs数组,然后返回一个带有null的对象作为designId + name(我已经提供了一个编辑)
【解决方案2】:

您可以使用Array.reduce 函数和Array.map 来生成数组:

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);

【讨论】:

    【解决方案3】:

    您可以将高阶函数Array.prototype.reduce()Array.prototype.map() 一起使用

    const newArr = tests.reduce((prev, {designs, ...current}) => [
       ...prev, ...designs.map(design => ({...design,...current}));
    ]      
    , []);
    

    您的方法和这种高阶方法的性能是相同的,因为Array.prototype.reduce 贯穿整个数组并且只是为我们提供了initialValue 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-11
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      • 2015-09-01
      相关资源
      最近更新 更多