2017-12-27 29 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에 의해 반환 된 데이터의 예입니다 .215.242,6,7037358,53.111350,53.111350 ","8.248.209.245,6,2459465,18.561725,71.673076 ","192.168.2.86,6,604136,4.559450,76.232525 ","192.168.2.43,6,295422,2.229567 , "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, 69862 , 0.527253,85.508931 "," "]

이 방법은 효과가 있지만 실제로는 잘못되었습니다. 각도 또는 TypeScript의 일부 기능이 없기 때문에 각 줄을 매핑하여 개체 배열을 직접 만들 수 있습니까? 내가 제대로 코드를 이해한다면

+0

을 쉼표로 구분 된 문자열 배열을 TopTalkers 배열로 바꾸고 싶습니까? – mchandleraz

+0

변환을 행렬을 받아서 가독성을 위해 TopTalker를 반환하는 자체 팩토리 함수로 이동할 수는 있지만 그 정도입니다. – toskv

+0

@toskv 이렇게 모듈화하는 것 외에도 실제로 할 수있는 "자동"이란 무엇입니까? –

답변

1

, 이런 일이 나는 것을 점점 탐구 것, (IMO 및 읽기 훨씬 쉽다) 이상적으로

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);   
}