首页 > 解决方案 > 将键从另一个对象合并到嵌套对象中

问题描述

使用一组对象,例如:

const activities = [{
    id: 11129,
    recap: {
        id: 11129,
        recapValues: [
            {
                id: 1,
                internalName: 'Foo',
            },
            {
                id: 2,
                internalName: 'Bar',
            },
            {
                id: 6,
                internalName: 'Bongo',
            },
        ],
    },
},
{
    id: 11130,
    recap: {
        id: 11130,
        recapValues: [
            {
                id: 4,
                internalName: 'Bingo',
            },
            {
                id: 5,
                internalName: 'Bango',
            },
            {
                id: 6,
                internalName: 'Bongo',
            },
        ],
    },
}]

我的目标是通过匹配引用对象数组中的键来为每个嵌套对象添加一个responseOptions和键,例如:constraintsrecapValuesinternalName

const questions = [{
    internalName: 'Foo',
    responseOptions: null,
    constraints: {
        date: {},
    },
},
{
    internalName: 'Bar',
    responseOptions: {},
    constraints: null,
},
{
    internalName: 'Bango',
    responseOptions: null,
    constraints: null,
},
{
    internalName: 'Bingo',
    responseOptions: {},
    constraints: null,
},
{
    internalName: 'Bongo',
    responseOptions: null,
    constraints: {
        time: {},
    },
}]

对于预期结果:

[{
    id: 11129,
    recap: {
        id: 11129,
        recapValues: [
            {
                id: 1,
                internalName: 'Foo',
                responseOptions: null,
                constraints: {
                    date: {},
                },
            },
            {
                id: 2,
                internalName: 'Bar',
                responseOptions: {},
                constraints: null,
            },
            {
                id: 6,
                internalName: 'Bongo',
                responseOptions: {},
                constraints: {
                    time: {},
                },
            },
        ],
    },
},
{
    id: 11130,
    recap: {
        id: 11130,
        recapValues: [
            {
                id: 4,
                internalName: 'Bingo',
                responseOptions: null,
                constraints: null,
            },
            {
                id: 5,
                internalName: 'Bango',
                responseOptions: {},
                constraints: null,
            },
            {
                id: 6,
                internalName: 'Bongo',
                responseOptions: {},
                constraints: {
                    time: {},
                },
            },
        ],
    },
}]

我的尝试导致下面的代码只为每个对象添加一次responseOptionsandconstraints键,而不是为里面的每个单独的问题:recapValuesrecapValues

activities.map(activity => ({
  ...activity,
  recap: {
    ...activity.recap,
    recapValues: [
      ...activity.recap.recapValues,
      ...activity.recap.recapValues
        .forEach(q => questions
          .find(obj => obj.internalName === q.internalName)),
    ],
  },
}))

我错过了什么阻止了预期的结果?

标签: javascriptarraysobject

解决方案


forEach返回undefined并且您想要maprecapValues:

activities.map(activity => ({
 ...activity,
 recap: {
   ...activity.recap,
   recapValues: activity.recap.recapValues.map(value => ({
      ...value,
      ...questions.find(obj => obj.internalName === value.internalName),
   }),
  },
}))

我们可以通过使用映射函数来美化一点:

 const mapObj = (key, mapper) => ({ [key]: val, ...rest }) => ({ [key]: mapper(val), ...rest });
 const map = mapper => arr => arr.map(mapper);

 const format = map(
    mapObj("recap", 
        mapObj("recapValues", 
           map(value => ({
             ...value,
             ...questions.find(q => q.internalName === value.internalName)
          }))
       )
   )
);

const output = format(activities);

推荐阅读