В одном из моих проектов мне нужно было сопоставить два объекта следующим образом:

const artistData = [
{
   "_id":"abc123",
   "name":"John Sams",
   "age" : 35
},
{
   "_id":"pqr123",
   "name":"John Adams",
   "age" : 45
},
{
   "_id":"abc455",
   "name":"Patrick",
   "age" : 39
},
{
   "_id":"xyz345",
   "name":"Matt Hardy",
   "age" : 43
}

]

const messageData = [
{
"artistId": "xyz345",
"message": "Hello Matt!!!"
}
]

Здесь я хочу сопоставить artist_id из 'artistData' и artistId из 'messageData', чтобы извлечь данные из первого массива объектов. Я использовал следующий метод:

artistData.some(artistId => artistId._id === messageData.artistId)

Какое решение может быть лучшим из возможных?

-1
Pranav 8 Мар 2021 в 19:32

2 ответа

Лучший ответ

Какое точное требование вас просят выполнить? Вы пытаетесь получить все сообщения, принадлежащие определенному артисту? В зависимости от того, что именно вы пытаетесь сделать, будет другой ответ.

Например, если вы начали с исполнителя someArtist и хотите, чтобы ему были отправлены все сообщения, вы можете сделать что-то вроде этого:

messageData.filter(message => message.artistId === someArtist._id)

Если вы начали с сообщения someMessage и хотите, чтобы исполнитель был отправлен, вы можете сделать что-то вроде этого:

artistData.find(artist => artist._id === someMessage.artistId)

Редактировать

Если вы хотите добавить имя исполнителя к сообщению, вы можете сделать что-то вроде этого:

const messageWithArtistName = {
  ...someMessage, 
  name: artistData.find(artist => artist._id === someMessage.artistId).name}
}

Обратите внимание, что это не удастся, если вы не найдете подходящего исполнителя.

Отредактировано снова

Если вы хотите сделать это, будут все сообщения.

messageData.map(message => {...message, name: artistData.find(artist => artist._id === message.artistId).name })
2
Dakota Lee Martinez 8 Мар 2021 в 17:30

Лучше сделать наоборот.

Давайте сначала переберем сообщения, используя .forEach(), и для каждого отдельного сообщения попытаемся найти исполнителя, мы будем использовать метод массива .find()

const artists = [
{ id: "19823908109", name: "Johnas Smith", age: 44 },
{ id: "00823933109", name: "Jane Doe",     age: 19 },
{ id: "30823908109", name: "Mary Air",     age: 20 },
{ id: "58239081091", name: "Tom Silver",   age: 87 },
];

const messages = [
{ id: "58239081091", message: "Hello World" },
{ id: "30823908109", message: "Hi, Tom!" }
];



// Loop through every single message
messages.forEach( ({ id, message }) => {

  // Find the artist
  const artist = artists.find( artist => artist.id === id );
  
  // Log the artist
  console.log(artist)
});
0
pheianox 8 Мар 2021 в 17:15