Javascript 将数组映射到Typescript/Angular中的对象

Javascript 将数组映射到Typescript/Angular中的对象,javascript,angularjs,typescript,Javascript,Angularjs,Typescript,我有一个查询后端API的服务。API返回一组逗号分隔的文本行。这些列对应于我创建的TypeScript类中的属性。课程为: export class TopTalker { constructor( public source: string, public protocol: number, public packets: number, public _percent: string, public _t

我有一个查询后端API的服务。API返回一组逗号分隔的文本行。这些列对应于我创建的TypeScript类中的属性。课程为:

export class TopTalker {
    constructor(
        public source: string,
        public protocol: number,
        public packets: number,
        public _percent: string,
        public _tally: string
    ) {}
}
我目前正在使用这些对象构建对象,如下所示:

  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')
        );
  }
getTopTalkers(){
这是。_silk.topTalkers()。订阅(
数据=>{
让结果=[];
结果=数据;
this.topTalkers=[];
for(让结果行显示){
让thisTalker=row.split(/,/);
让a=新的TopTalker(
thisTalker[0],
这位发言人[1],
这位发言人[2],
这位发言人[3],
该发言人[4]);
如果(thisttalker.length>1){//得到的是一个空行
这个。topTalkers。推(a);
}
}
console.log(this.largestTransfers);
},
err=>console.error(err),
()=>console.log('Processed talker')
);
}
以下是API返回的数据示例:

[“8.248.215.242,67037358,53.111350,53.111350”,“8.248.209.245,62459465,18.561725,71.673076”,“192.168.2.86,6604136,4.559450,76.232525”,“192.168.2.43,6295422,2.229567,78.462092”,“192.168.2.39,62547474746,1.922583,80.384675”,“8.248.211.241.241,6182544,1.377670,81.762.768,162.0383”,“8.250.125.246,6152862,1.153658,84.275697”、“8.248.213.243,693544,0.705982,84.981679”、“167.206.10.209,669862,0.527253,85.508931”


这是可行的,但感觉确实是错误的。Angular或TypeScript是否有一些功能我没有,可以让我映射每一行来直接创建一个对象数组?

如果我正确理解您的代码,类似这样的功能应该非常接近您想要的(而且更容易阅读,我想)


理想情况下,我会尝试更新该服务,使其不返回奇怪的逗号分隔字符串。

如果我正确理解了您的代码,类似这样的内容应该与您所追求的内容非常接近(而且更易于阅读,依我看)


理想情况下,我会尝试更新该服务,使其不返回奇怪的逗号分隔字符串。

通过将映射工作移动到主体中,可以稍微简化构造函数签名,如下所示:

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

通过将映射工作移动到主体中,可以稍微简化构造函数签名,如下所示:

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

您想将逗号分隔字符串数组转换为TopTalker数组,对吗?您可以将转换移动到它自己的工厂函数中,该函数接收一行并返回TopTalker以提高可读性,但基本上就是这样。@toskv所以除了模块化它之外,实际上没有什么比“自动”更重要的了“这可以做到吗?不,javascript不能将任意字符串转换为任意对象:”(您的代码将字符串数组转换为对象数组。我不认为数组是问题的一部分。问题是把一行转换成一个说话者。但是也许我把问题搞错了,如果是这样的话,请帮助我理解。):你想把逗号分隔的数组转换成一组占卜者,正确吗?您可以将转换移到它自己的工厂函数中,该函数接收一行并返回TopTalker以便于可读性,但基本上就是这样。@toskv所以除了模块化它之外,真的没有什么比“自动”更能做的了吗?不,javascript不能将任意字符串转换为任意对象(您的代码将字符串数组转换为对象数组。我不认为数组是问题的一部分。问题是把一行转换成一个说话者。但也许我把问题搞错了,如果是这样,请帮助我理解。)