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

时间:2019-10-09 09:31:51

标签: angular typescript syncfusion

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

我正在为GridLayout使用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-“一个”, 2-“两个”,

这样,将显示字符串而不是接收到的数字,但似乎没有字。 我必须在通话中进行一些更改:

// in service

  someFunction(): Observable<Data[]>{

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

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

2 个答案:

答案 0 :(得分:0)

只是一个简单的例子,数字上带有开关盒: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

  

编辑:当您想保留对象并且只想变换一些属性时映射

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

...

答案 1 :(得分:0)

您可以尝试创建将数字转换为类似

的单词的函数
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)//
          }
        })
       }
     )))