可观察类的两个数组之间的映射

时间:2019-04-05 15:34:33

标签: angular dictionary rxjs observable

我有两个给定的类SgFormsBaseQuestionBase,其成员名称略有不同,我想将其中的observable[]转换为另一个。

import { of, Observable } from 'rxjs'
import { map} from 'rxjs/operators'

class SgFormsBase{
  constructor(
     public id: number,
     public survey: string
  ){}
}

class QuestionBase{
  constructor(
     public qid: number,
     public qsurvey: string
  ){}
}

const a = new SgFormsBase(11, 'Endo')
const b = new SgFormsBase(12, 'Kolo')
const sg = of([a, b] )

function toQuestionsBase(sgforms: Observable<SgFormsBase[]>): Observable<QuestionBase[]> {
  return sgforms.pipe(map(
     sgform =>  new QuestionBase(sgform.id, sgform.survey)))
}

toQuestionsBase(sg)

2 个答案:

答案 0 :(得分:2)

由于源的可观察项是SgFormsBase[]的可观察项,因此它发出的每个值都是一个完整的数组。因此,可观察的map运算符将接收整个数组。可观察的map运算符内需要另一个数组映射运算符。

function toQuestionsBase(sgforms: Observable<SgFormsBase[]>): Observable<QuestionBase[]> {
  return sgforms.pipe(map(
    sgforms => sgforms.map(sgform => new QuestionBase(sgform.id, sgform.survey))))
}

答案 1 :(得分:1)

参数 sgForms SgFormsBase array 解析。因此,您需要做的是分别发出每个值,映射各个值到 QuestionBase实例,然后将其压缩回去一个数组

function toQuestionsBase(sgforms: Observable<SgFormsBase[]>): Observable<QuestionBase[]> {
  return sgforms.pipe(
    mergeMap((sgs: SgFormsBase[]) => sgs),
    map((sgForm: SgFormsBase) => new QuestionBase(sgForm.id, sgForm.survey)), 
    toArray());
}