如何正确使用 RxJS 为返回到 Observable 的数组的每个对象添加一个新字段?

How can I correctly use RxJS to add a new field to each object of an array returned into an Observable?

我不是很喜欢 RxJS,我有以下疑问。

进入这个 Angular 服务 class 我有这个方法从 Firebase FireStore 数据库检索数据:

async getAllEmployees() { 
    return <Observable<User[]>> this.firestore.collection('users',ref => ref.where('profileType', '!=', 'admin')).valueChanges();          
  } 

如您所见,它正在返回一个 User 对象的 Observable。

其中 User 是这个接口:

export interface User {
    firstName: string;
    surname: string;   
    completeName: string;  
    email: string;
    photoUrl: string;
    phoneNumber: string;
    companyName: string;
    vatID: string;
    profileType: 'admin' | 'user' | 'unknown';    
    UID: string;    
    approved:boolean;
}

现在我需要添加 completeName 字段(Firestore 上没有显示,因此不会检索到该字段),它是 firstName[= 的串联35=] 和 surname 字段到返回的 Observable 的检索数组的每个对象。我在想也许我可以使用 RxJS 地图运算符来完成这个任务。我试图做这样的事情:

return <Observable<Employee[]>> this.firestore.collection('users',ref => ref.where('isEmployee', '==', true)).valueChanges()
                                              .pipe(map(userObj => {

                                                        const completeObj = {
                                                          completeName = userObj["firstName"] + " " + userObj["surname"],
                                                          ...userObj
                                                        }
                                                        console.log("completeObj: ", completeObj);
                                                        return userObj;
                                                    }));

但是这样做我得到它创建了以下对象(我可以在 console.log 到我的 Chrome 控制台中看到它):

completeObj:  
{0: {…}, completeName: "undefined undefined"}
0: {firstName: "Andrea", isEmployee: true, socialSecurityCode: "NBLNDRH501O", password: "XXXXXX", isAdmin: false, …}
completeName: "undefined undefined"
__proto__: Object

所以基本上在我看来,它并没有将这个新的计算字段添加到作为 Observable 返回的数组的每个对象中,而是添加到 Observable 本身。

为什么?怎么了?我错过了什么?我该如何解决?

您不能通过赋值初始化 属性。

这是一个对象:

{
  firstName: "Hillary",
  lastName: "Brown"
}

这不是有效的语法:

{
  firstName = "Hillary",
  lastName = "Brown"
} 

我很惊讶你编译了什么。也许它在当前上下文(this)中做了一些奇怪的事情?我只是尝试做类似的事情,但无法为我编译。

此外,您的地图 return 与它获得的值相同,您可能想要 return 新对象。

return <Observable<Employee[]>> this.firestore.collection(
  'users',
  ref => ref.where('isEmployee', '==', true)
).valueChanges().pipe(
  map(userObj => ({
    ...userObj,
    completeName: userObj["firstName"] + " " + userObj["surname"]
  })),
  tap(completeObj => console.log("completeObj: ", completeObj))
);

您的 userObj 是一组员工。 rxjs operator map 映射这个数组,而不是数组元素。您需要的是“嵌套”地图。

return <Observable<Employee[]>> this.firestore.collection('users',ref => ref.where('isEmployee', '==', true))
  .valueChanges().pipe(
    map(usersArr => usersArr.map(user => ({ ...user, completeName: user.firstName + " " user.surname}))),
  );