Json Document中的Rxjs Map Array为新的Array类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Json Document中的Rxjs Map Array为新的Array类型相关的知识,希望对你有一定的参考价值。

我正从Angular Service中的PouchDB中检索文档。以下列格式检索文档:

{
"_id":"segments",
"_rev":"1-4f0ed65cde23fe724db13bea1ae3bb13",
"segments":[
    { "name":"Aerospace" },
    { "name":"Auto repair" },
    { "name":"Commercial" },
    { "name":"Education" },
    { "name":"Energy" },
    { "name":"Farm/ranch" },
    { "name":"Furniture" },
    { "name":"Heavy Equipment" },
    { "name":"Hobbyist" },
    { "name":"Infrastructure" },
    { "name":"Luxury/Leisure" },
    { "name":"Military" },
    { "name":"MUP" },
    { "name":"Processing" },
    { "name":"Rail" },
    { "name":"Transportation" }
]}

我想将它映射到一个新的数组,看起来像:

[
  { value: "Aerospace", viewValue: "Aerospace" },
  { value: "Auto Repair", viewValue: "Auto Repair" },
  { value: "Commercial", viewValue: "Commercial" }
  ...
 ]

为此,我在我的服务中尝试了这段代码:

getSegments(): Observable<any[]> {
  return from(this.database.get('segments'))
  .pipe(
    map((results) => results.segments)
  );
}

我在我的Component中转换数组,如下所示:

segments: SegmentsLookup[] = [];
...
this.lookupDbService.getSegments()
  .subscribe(data => {
    data.forEach(element => {
      this.segments.push({value: element.name, viewValue: element.name});
  });
});

这有效,但我知道有一种方法可以在服务代码中正确映射。此外,当这样做时,编译器抱怨“results.segments”声明“属性”段“类型'{}}上不存在”。

如何在Service的“getSegments”方法中将检索到的数据映射到我需要的数组?

答案

你可以做转换是两步:

  • 管道/地图以提取段
  • array / map转换为最终数据类型

请看这里的例子:https://stackblitz.com/edit/angular-ikb2eg?file=src%2Fapp%2Fapp.component.ts

let transformedData = observableData.pipe(
  map(data => {
    console.log(data, data.segments.length);
    return data.segments.map(element => {
      return { value: element["name"], viewValue: element["name"] };
    });
  })
);

transformedData.subscribe(data => {
  this.mylist = data;
});
另一答案

您可以扩展map函数并将其从组件中删除,如下所示:

map(result => {
        result = result.segments;
        let data = [];
        result.forEach(element => {
            data.push({value: element.name, viewValue: element.name});
        });
        return data;
 });

以上是关于Json Document中的Rxjs Map Array为新的Array类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在 RxJS 中处理这个 json 响应?

[RxJS] Transformation operator: map and mapTo

[RxJS] Getting Input Text with Map

rxjs里的Observable对象subscribe方法的执行原理

如何展平 rxjs 中的嵌套数组

5 张弹珠图彻底弄清 RxJS 的拉平策略:mergeMapswitchMapconcatMapexhaustMap