如何在显示之前映射接收到的数据?

How do I map received data before they get displayed?

我想知道如何解决以下问题:

我正在为网格布局使用 Syncfusion。如文档中所述,我将接收到的数据存储在名为 datasource.ts 的外部文件中:

//component.ts
//getting data from server

     ngOnInit() {

       this.user.someFunction().subscribe(data => {
       this.datasource.data = data;

        }) 
       }

在我的 html 文件中,我使用该数据构建网格:

   <ej-grid id="Grid" #grid [dataSource]="datasource.data" allowPaging="true" 
    allowFiltering="true" 
    selectionType="single" allowSelection="true"
    [selectionSettings]="selectionMode" (rowSelected)="rowSelected($event)"  
    (recordDoubleClick)="Doubleclick($event)">
      <e-columns>
          <e-column field="digit" headerText="Digits"></e-column>
      </e-columns>
  </ej-grid>

到目前为止一切顺利。 我想映射我收到的数字(由于类型数字)并将其替换为相关字符串,例如:

1 - "One", 2- "Two",

这样显示的是字符串而不是接收到的数字,但好像不是字。 我必须在通话中更改一些内容:

// in service

  someFunction(): Observable<Data[]>{

     return this.http.get<Data[]>(url).pipe(
     map((data: any[]) => data.map(order => this.orderadapter.adapt(data)
     )));
  }

但我不知道如何在那里放置另一个映射。 任何人都可以帮助一些(虚拟)代码吗?也许我的问题还有其他解决方案?

只是一个简单的例子,数字上有 switch case:1、2

this.user.someFunction().subscribe(data => {
    this.datasource.data = data.map(digit => this.transform(digit));
}) 

transform(digit: number): string {
    switch (digit) {
        case 1: return 'One';
            break;
        case 2: return 'Two';
            break;
        default: return 'Not one or two';
    }
}

这是map docu

Edit: Map when you want to keep your object and just want to transform some attributes

this.user.someFunction().subscribe(data => {
    this.datasource.data = data.map(data => data.digit = this.transform(data.digit));
})

...

您可以尝试创建一个将数字转换为单词的函数,例如

inWords (num) {
var a = ['','one ','two ','three ','four ', 'five ','six ','seven ','eight ','nine ','ten ','eleven ','twelve ','thirteen ','fourteen ','fifteen ','sixteen ','seventeen ','eighteen ','nineteen '];
var b = ['', '', 'twenty','thirty','forty','fifty', 'sixty','seventy','eighty','ninety'];

    if ((num = num.toString()).length > 9) return 'overflow';
    n = ('000000000' + num).substr(-9).match(/^(\d{2})(\d{2})(\d{2})(\d{1})(\d{2})$/);
    if (!n) return; var str = '';
    str += (n[1] != 0) ? (a[Number(n[1])] || b[n[1][0]] + ' ' + a[n[1][1]]) + 'crore ' : '';
    str += (n[2] != 0) ? (a[Number(n[2])] || b[n[2][0]] + ' ' + a[n[2][1]]) + 'lakh ' : '';
    str += (n[3] != 0) ? (a[Number(n[3])] || b[n[3][0]] + ' ' + a[n[3][1]]) + 'thousand ' : '';
    str += (n[4] != 0) ? (a[Number(n[4])] || b[n[4][0]] + ' ' + a[n[4][1]]) + 'hundred ' : '';
    str += (n[5] != 0) ? ((str != '') ? 'and ' : '') + (a[Number(n[5])] || b[n[5][0]] + ' ' + a[n[5][1]]) + 'only ' : '';
    return str;
}

然后

return this.http.get<Data[]>(url).pipe(
     map((data: any[]) => {
     return data.map(d=>{
         return {
             this.inWords(yourdigitkey)//
          }
        })
       }
     )))