2017-12-27 15 views
0

私はバックエンドAPIを照会するサービスを持っています。 APIは、カンマで区切られた一連のテキストを返します。これらの列は、私が作成したTypeScriptクラスの属性に対応しています。クラスは次のとおりです。Typescript/Angularでオブジェクトに配列をマッピングする

export class TopTalker { 
    constructor(
     public source: string, 
     public protocol: number, 
     public packets: number, 
     public _percent: string, 
     public _tally: string 
    ) {} 
} 

私は現在、そのように、これらのうち、オブジェクトを構築しています:

[ "8.248:ここ

getTopTalkers() { 
    this._silk.topTalkers().subscribe(
     data => { 
     let results = <any>[]; 
     results = data; 
     this.topTalkers = <any>[]; 
     for (let row of results) { 
      let thisTalker = row.split(/,/); 
      let a = new TopTalker(
      thisTalker[0], 
      thisTalker[1], 
      thisTalker[2], 
      thisTalker[3], 
      thisTalker[4]); 
      if(thisTalker.length > 1){ // Was getting a blank line 
      this.topTalkers.push(a); 
      } 
     } 
     console.log(this.largestTransfers); 
     }, 
     err => console.error(err), 
     () => console.log('Processed talkers') 
     ); 
    } 

は、APIによって返されるデータの一例です「192.168.2.86,6,604136,4.559450,76.232525」、「192.168.2.43,6,295422,2.29597」、 「78.462092」、「192.168.2.39,6,254746,1.922583,80.384675」、「8.248.211.241,6,182544,1.377670,81.762345」、「192 」、「8.250.125.246,6,152862,1.153658,84.275697」、「8.248.213.243,6,93544,0.705982,84.981679」、「167.206.10.209,6,69862 、0.527253,85.508931 "、" "]

これは機能しますが、実際は間違っています。 AngularまたはTypeScriptのいくつかの機能がありますが、これはオブジェクトの配列を直接作成するために各行をマップできるようにしていますか?

+0

コンマで区切られた文字列をTopTalkerの配列に変換したいのですか? – mchandleraz

+0

あなたは変換をそれ自身のファクトリ関数に移すことができます。それは行を受け取り、読みやすくするためにTopTalkerを返しますが、それはかなりです。 – toskv

+0

@toskvモジュール化する以外に、実際にはもっと「自動」なものは何もありません。 –

答えて

1

私が正しくあなたのコードを理解していれば、このようなものは、あなたが後にしているものにかなり近いはずである(と芋、読みずっと簡単です)

getTopTalkers() { 
    this._silk.topTalkers().subscribe(
    results => { 
     this.topTalkers = results.map((row, index, rows) => { 
     let thisTalker = row.split(/,/); 

     // Avoid blank lines by checking length 
     if (thisTalker.length > 1) { 
      new TopTalker(
      thisTalker[0], 
      thisTalker[1], 
      thisTalker[2], 
      thisTalker[3], 
      thisTalker[4] 
     ); 
     } 
     }) 
    }, 
    err => console.error(err), 
    () => console.log('Processed talkers') 
); 
} 

理想的には、私はそれを取得探検したいですグロテスクでカンマ区切りの文字列を返さないようにサービスが更新されました。

1

あなたはそうのように、体内にマッピング作業を移動することによって、あなたのコンストラクタの署名を少し簡略化することができます:インスタンス化コードから複雑さの一部を除去するであろう

class TopTalker { 

    public source: string; 
    public protocol: number; 
    public packets: number; 
    public _percent: string; 
    public _tally: string; 

    constructor(sourceRow: string[]) { 
     this.source = sourceRow[0]; 
     this.protocol = parseInt(sourceRow[1]); 
     this.packets = parseInt(sourceRow[2]); 
     this._percent = sourceRow[3]; 
     this._tally = sourceRow[4]; 
    } 
} 

for (let row of results) { 
     let thisTalker = row.split(/,/); 
     let a = new TopTalker(thisTalker); 
     this.topTalkers.push(a);   
} 
関連する問題