在RxJS中使用Map Operator转换数据

时间:2019-11-20 10:41:17

标签: angular rxjs6

我有一个第三方API,该API返回以下数据- 已使用HttpClient.

从Angular Service中调用了它
const someObject = {

    employees:[   

        {name:"XYZ",age:30},
        {name:"ABC",age:28},
    ]
}

我想将此数据转换为以下结构,其中 姓名,年龄保持不变,并且说明将根据姓名和年龄

进行计算
{ 
  name : 
  age  : 
  description: //calculate based on name and age 
},
{ 
  name : 
  age  : 
  description:  //calculate based on name and age 
}

上面的结构将被键入一些Interface,并且最终从我的Angular service

返回

如何使用RxJS执行此操作?

在我为此苦苦挣扎的时候,有人可以帮我吗?

最终,我的Angular服务将返回上述结构的数据吗?

编辑:

基于得到的响应,我在下面进行了尝试:

return this.http.get<any>(url).pipe(
            map(data => data.employees),
            map(employees =>{
              values.map(employee =>{
                console.log('individual value =',employee);
                return{
                  employee,
                  description:employee.name + "" + employee.age 
                }
              })          
            })
        )  

但是,当订阅此Observable时,我将获得undefined的价值。

是因为第二个映射运算符map(employees没有返回任何东西吗? 如何使它返回从内部地图构建的对象?

3 个答案:

答案 0 :(得分:1)

因此,基本上,您想添加并处理其他属性:

假设这是您服务中的方法:

getData(){...}

然后您可以简单地做到这一点:

const employees$ = this.service.getData().pipe(
  map(data => data.employees),
  map(employees => employees.map(employee => {
       const description = `My name is ${employee.name}`;
       return {...employee, description};
    }
  )
);

然后在employees$中,您可以通过具有所需结构的员工来观察

答案 1 :(得分:1)

    const someObject = {
    
        employees:[   
            {name:"XYZ",age:30},
            {name:"ABC",age:28},
        ]
    }
    
    
    let description = 'description goes here';
    let result = someObject.employees.map( o => { return  {...o, ...{description} } });
    console.log(result);

答案 2 :(得分:0)

您可以尝试这样的事情

of([
        {name:"XYZ",age:30},
        {name:"ABC",age:28},
    ]).pipe(
    map(employees => 
      employees.map(
        elem => {return {
          "name": elem.name,
          "age": elem.age,
          "description": 'blablabla'
        }}
      )
    )
  ).subscribe(employees => console.log(employees))

现在只需更改描述中的字符串即可。 希望我能帮忙