Как изменить наблюдаемые значения с помощью операторов rxjs?

#angular #rxjs

#angular #rxjs

Вопрос:

У меня есть приложение angular, и в одном из компонентов я получаю уведомления пользователя (электронные письма) через сервис. служба возвращает массив объектов, и в каждом объекте содержится информация об электронном письме, такая как тема, идентификатор пользователя отправителя и т.д. структура массива объекта электронной почты выглядит следующим образом:

 [{
  UserId:"...",

  Notification:{
     Subject:null,
     Body:"<div>...</div>",
     .
     .
     .
  },
  .
  .
  .
},
.
.
.]
  

некоторые электронные письма не имеют темы, а значение Subject свойства находится null в объекте. Я хочу установить значение для электронных писем с Subject:null помощью .

 this.notifService.getAllNotificationsForCurrentUser(userId)
.pipe(
    map(emails => {
       emails.map(email=>{
         if(email.Notification.Subject === null){
            email.Notification.Subject = "(No Subject)";
         }
       })
    }
)
.subscribe(
    result=> this.messages = result
);
  

Я использовал map operator, и он не работает. и в нем есть некоторые ошибки:

 Cannot read property 'Notification' of undefined
  

как я могу это исправить?

Комментарии:

1. привет, не могли бы вы рассказать подробнее еще раз? в чем конкретно заключается ваша проблема?

2. Если вы что-то пробовали, и это не сработало, тогда опубликуйте то, что вы пробовали, точно расскажите, что вы ожидали, и что произошло вместо этого.

3. Я обновил свой вопрос.

Ответ №1:

Используйте оператор сопоставления rxjs с Array.prototype.map().

  1. Первый map позволяет изменять массив электронных писем, как если бы они текли по потоку. Он отображает элементы потока, каждый элемент представляет собой массив электронных писем.

  2. Второй map изменяет массив электронных писем, чтобы установить пустые subject поля no subject . Он отображает массив электронных писем, каждый элемент является электронной почтой.

 import { map } from 'rxjs/operators';

this.notifService.getAllNotificationsForCurrentUser(userId).pipe(
    map(emails => {
        return emails.map(email => ({
            ...email,
            Notification: {
                ...Notification,
                Subject: email.subject ? email.subject : 'no subject'
            }
        }));
    })
).subscribe(
    result=> this.messages = result
);
  

Комментарии:

1. @Nastaran Heydari, вы должны вернуть результат из внутренней карты, в моем примере я использую неявный возврат. Также ваша внутренняя карта ничего не возвращает, в этом случае используйте forEach

Ответ №2:

Если это только для целей отображения, вы должны просто сделать

 {{email.Notification.Subject || '(No Subject)'}}
  

Если нет, перейдите к отображению массива.