Я хочу объединить массивы машинописных текстов, чтобы создать новый массив

Существуют массивы mainData и GroupData.
Я хотел бы создать массив, подобный newData, объединив идентификатор mainData и GroupData. Условие состоит в том, что идентификатор mainData и groupId GroupData совпадают.
Я попытался реализовать следующее, но возникает следующая ошибка.

ошибка

TypeError: Cannot set properties of undefined (setting 'type')

'item' is never reassigned. Use 'const' instead.eslint

        const mainData = [
          { id: 1, name: 'aaa' },
          { id: 2, name: 'bbb' },
          { id: 3, name: 'ccc' },
          { id: 4, name: 'ddd' },
        ];

        const groupData = [
          { id: 1, type: 1, groupId: 1, context: 'test' },
          { id: 2, type: 2, groupId: 1, context: 'txt' },
          { id: 3, type: 3, groupId: 1, context: 'hoge' },
          { id: 4, type: 1, groupId: 1, context: 'hoge' },
          { id: 5, type: 2, groupId: 1, context: 'test' },
          { id: 6, type: 2, groupId: 2, context: 'test' },
          { id: 7, type: 1, groupId: 3, context: 'test' },
          { id: 8, type: 1, groupId: 3, context: 'test' },
          { id: 9, type: 1, groupId: 4, context: 'test' },
        ];
  const mainData = [
    { id: 1, name: 'aaa' },
    { id: 2, name: 'bbb'},
    { id: 3, name: 'ccc' },
    { id: 4, name: 'ddd' },
  ];

  const groupData = [
    { id: 1, type: 1, groupId: 1, context: 'test' },
    { id: 2, type: 2, groupId: 1, context: 'txt' },
    { id: 3, type: 3, groupId: 1, context: 'hoge' },
    { id: 4, type: 1, groupId: 1, context: 'hoge' },
    { id: 5, type: 2, groupId: 1, context: 'test' },
    { id: 6, type: 2, groupId: 2, context: 'test' },
    { id: 7, type: 1, groupId: 3, context: 'test' },
    { id: 8, type: 1, groupId: 3, context: 'test' },
    { id: 9, type: 1, groupId: 4, context: 'test' },
  ];

const newData = [
  {
    id: 1,
    name: 'aaa',
    content: [
      { type: 1, context: 'test' },
      { type: 2, context: 'txt' },
      { type: 3, context: 'hoge' },
      { type: 1, context: 'hoge' },
      { type: 2, context: 'test' },
    ],
  },
  {
    id: 2,
    name: 'bbb',
    content: [{ type: 2 context: 'test' }],
  },
  {
    id: 3,
    name: 'ccc',
    content: [
      { type: 1 context: 'test' },
      { type: 1, context: 'test' },
    ],
  },
  {
    id: 4,
    name: 'ddd',
    content: [{ type: 1, context: 'test' }],
  },
];
        type NewDataType = {
          id: number;
          name: string;
          content: Content[];
        };
        type Content = {
          type: number;
          content: string;
        };
        mainData.map(m => {
          const blocks: NewDataType[] = [];
          groupData.map(g => {
            const sameGroups = groupData.filter(i => i.groupId === m.id);
            let item: Content[] = [];

            if (sameGroups) {
              sameGroups.map((i, index) => {
                item[index].type = i.type;
                item[index].content = i.context;
              });
            }
            blocks.push({
              id: m.id,
              name: m.name,
              content: item,
            });
          });
        });
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
0
0
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

вы можете использовать lodash для объединения массивов с условиями

_.merge(_.keyBy(array1, 'id'), _.keyBy(array2, 'id'));
Ответ принят как подходящий

Насколько я понимаю ваш вопрос, вы хотите объединить mainData и groupData, чтобы получить newData. Мой подход был бы

  const mainData = [
      { id: 1, name: 'aaa' },
      { id: 2, name: 'bbb' },
      { id: 3, name: 'ccc' },
      { id: 4, name: 'ddd' },
    ];

 const groupData = [
      { id: 1, type: 1, groupId: 1, context: 'test' },
      { id: 2, type: 2, groupId: 1, context: 'txt' },
      { id: 3, type: 3, groupId: 1, context: 'hoge' },
      { id: 4, type: 1, groupId: 1, context: 'hoge' },
      { id: 5, type: 2, groupId: 1, context: 'test' },
      { id: 6, type: 2, groupId: 2, context: 'test' },
      { id: 7, type: 1, groupId: 3, context: 'test' },
      { id: 8, type: 1, groupId: 3, context: 'test' },
      { id: 9, type: 1, groupId: 4, context: 'test' },
    ];

let newData = [];

mainData.forEach(mainDataElement => {
    const newDataElement = {
           "id":  mainDataElement.id,
           "name":  mainDataElement.name,
           "content" : []
    }
    groupData
    .filter(groupDataElement => mainDataElement.id === groupDataElement.groupId)
    .forEach(element => {
        newDataElement.content.push(JSON.stringify(element));
        });
    newData.push(newDataElement);
});

console.log(newData);
console.log("Done");

Другие вопросы по теме