【问题标题】:How to add prefix to an Observable column value using map() operator?如何使用 map() 运算符为 Observable 列值添加前缀?
【发布时间】:2020-11-12 04:57:34
【问题描述】:

我有一个从服务方法返回的 Observable 值,我想添加一个前缀,例如'Prof' 作为前缀使用map() 运算符。

我返回 Observable 的方法是:

list(): Observable<EmployeesDto> { 
    items: Employees;
    ...
}

这是我尝试映射数据并分配它的方法:

...
employeeList : EmployeesDto;

this.service.list()
.pipe(
  map((list: EmployeesDto) => {
    list.items.forEach(m => {
      m.Name = 'Dr.' + m.Name
    });
    this.employeeList = list; // the code does not hit there and cannot set data
  })
)

但问题是我无法设置employeeList。那么,这个实现有什么问题呢?

更新: 在最后一步我使用这种方法进行了测试:

import { Component, OnInit } from "@angular/core";

import { of, Observable } from "rxjs";
import { map } from "rxjs/operators";

@Component({
  selector: "my-app",
  templateUrl: "./app.component.html"
})
export class AppComponent implements OnInit {
  employees$: Observable<any[]>;
  employeesDto$: Observable<any[]>;

  constructor() {}

  ngOnInit(): void {
    this.initializeData();
  }

  initializeData(): void {
    // this.employees$ = this.getMockEmployees().pipe(
    //   map(list => list.map(item => ({ ...item, name: `Dr. ${item.name}` })))
    // );

    this.employees$ = this.getMockEmployeesDto().pipe(
      map(list => list.map(item => ({ ...item, name: `Dr. ${item.name}` })))
    )
    .subscribe(list => {
      console.log(list);
    }
    )
  }

  getMockEmployees(): Observable<any[]> {
    const employees = [
      {
        name: "Ariana",
        age: 1
      },
      {
        name: "Tom",
        age: 2
      },
      {
        name: "Justin",
        age: 3
      }
    ];

    return of(employees);
  }

  getMockEmployeesDto(): Observable<any[]> {
    const employees$: Observable<any[]>;

    const employeesDto = [
      {
        name: "Ariana",
        age: 1
      },
      {
        name: "Tom",
        age: 2
      },
      {
        name: "Justin",
        age: 3
      }
    ];

    return of(employeesDto);
  }
}

【问题讨论】:

  • 你能分享一些样本吗
  • 对不起,我只是想知道上面的实现是否正确?我需要在.pipe() block 之后得到结果吗?

标签: javascript angular typescript promise observable


【解决方案1】:

你可以试试这个:

this.service
  .list()
  .pipe(
    map((list: EmployeesDto) => list.map(item => ({...item, Name: `Dr. ${item.Name}`})))
  )
  .subscribe(list => this.employeeList = list);

还创建了一个 Stackblitz Demo 供您参考

【讨论】:

  • 如何在您的回答中将this.employeeList 设置为this.employeeList = list
  • @PragDopravy 没问题,已经更新了我的答案。您可以在订阅时这样做,或者您也可以像在 stackblitz 演示中那样使用它。让我知道您是否一切都好:)
  • 非常感谢您的帮助。我有一个小问题:map 方法返回 list.items,但我需要返回 list 以便它还包含额外的参数,然后设置我的变量。我该怎么做?
  • 嗨@PragDopravy,如果您可以发布我可以处理的示例数据,是否有可能?只需 2 件就足够了 :)
  • 对不起,我无法保存并添加到更新中。我应该解释一下:有2张桌子;雇员和雇员Dto。 EmployeesDto 包含员工为items。因此,当我订阅我的服务方法时,我得到了EmployeesDto,当然其中的Employees 也是可用的。然后我想在员工中映射一个列。到此为止没有问题。 但是,之后我需要用第一个检索到的EmployeesDto.Employees 替换更新的Employees。我怎样才能做到这一点?我的意思是我只想获取EmployeesDto(包含Employees),然后只更新这些中的Employees
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 2013-01-30
  • 2013-11-30
  • 2016-03-07
相关资源
最近更新 更多