создать объект с помощью forEach - PullRequest
1 голос
/ 18 июня 2020

В зависимости от данных, возвращаемых запросом graphql, я хочу создать такой объект:

const DATA = [
    {
        id: 'bd7acbea-c1b1-46c2-aed5-3ad53abb28ba',
        imageUrl: defaultUrl,
        name: 'Johann',
    },
    {
        id: '3ac68afc-c605-48d3-a4f8-fbd91aa97f63',
        imageUrl: defaultUrl,
        name: 'Lars',
    },
    {
        id: '58694a0f-3da1-471f-bd96-145571e29d72',
        imageUrl: defaultUrl,
        name: 'Sarah',
    },
];

Однако я не понимаю, как я могу перебирать данные и создавать объект из этого. Например, таким образом я могу извлечь все имена fristname в массив:

var friendNames = new Array();

if (data !== null && data !== undefined) {
    data.users.nodes[0].userRelations.forEach((relation: UserRelation) => {
        friendNames.push(relation.relatedUser.firstName);
    });
}

Однако, помимо имен, я также хочу добавить идентификаторы и жестко закодированную ссылку (которая будет такой же для все позиции на данный момент). Но как мне получить мои данные в форме, подобной const DATA

1 Ответ

2 голосов
/ 18 июня 2020

То, что вы пытаетесь создать, - это создать новый массив на основе другого.

Для этой специальной цели функция map является наиболее адаптированной (map является двоюродным братом forEach).

Для каждой записи массива userRelations мы создадим новую запись в новом массиве.

const data = {
  users: {
    nodes: [{
      userRelations: [{
        relatedUser: {
          firstName: 'Johann',
        },
      }, {
        relatedUser: {
          firstName: 'Lars',
        },
      }, {
        relatedUser: {
          firstName: 'Paul',
        },
      }],
    }],
  },
};

const myFormattedData = data.users.nodes[0].userRelations.map(x => ({
  id: 'myId',
  imageUrl: 'myUrl',
  name: x.relatedUser.firstName,
}));

console.log(myFormattedData);

Альтернативный синтаксис:

const data = {
  users: {
    nodes: [{
      userRelations: [{
        relatedUser: {
          firstName: 'Johann',
        },
      }, {
        relatedUser: {
          firstName: 'Lars',
        },
      }, {
        relatedUser: {
          firstName: 'Paul',
        },
      }],
    }],
  },
};

const id = 'myId';
const imageUrl = 'myUrl';

const myFormattedData = data.users.nodes[0].userRelations.map(({
  relatedUser: {
    firstName: name,
  },
}) => ({
  id,
  imageUrl,
  name,
}));

console.log(myFormattedData);
...