Объединить ключи во вложенный объект из другого объекта - PullRequest
0 голосов
/ 02 октября 2018

Работа с массивом объектов, таких как:

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 и constraints к каждому вложенному объекту recapValues путем сопоставления ключа internalName измассив ссылочных объектов, например:

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: {},
                },
            },
        ],
    },
}]

Моя попытка привела к приведенному ниже коду, который добавляет только ключи responseOptions и constraintsодин раз для каждого recapValues объекта, а не для каждого отдельного вопроса внутри recapValues:

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

Что мне не хватает, что мешает желаемому результату?

1 Ответ

0 голосов
/ 02 октября 2018

forEach возвращает undefined, и вы хотите map recapValues:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...