如何映射具有索引签名的对象?

时间:2019-04-28 20:25:26

标签: json angular typescript api

我将要编写一个有角度的应用程序。它从api接收答案。这个答案内部是一个用字符串索引的数组(索引签名)。如何将该数组映射到常规数组?

api看起来像这样

Dim dt As DataTable = myDataSet.Tables("mytable")
Dim sum As Integer = Convert.ToInt32(dt.Compute("SUM(columnname)", "Columname = a OR Columname = b OR Columname = c OR Columname = c))

我想将它映射为一个看起来像这样的对象

{
    "Information": {
        "Created": "2019-04-25",
        "Version": "1.2"
    },
    "Files": {
        "2019-04-26": {
           'name': 'file1',
           'size': 5,
        },
        "2019-04-25": {
            'name': 'file2',
            'size': 3,
        },
    ...
        }
    }

在这里我想给出答案

export class Model {
  'Information': {
    'Created': string,
    'Version': string,
  };
  'Files': [{ 
    'date': Date,
    'name': string,
    'size': number,
  }];
}

3 个答案:

答案 0 :(得分:0)

我还没有测试过任何一个,但是总而言之,for循环检索对象data.File的所有键,并且您可以通过该键访问该对象。

getdata(url): void {
  this.http.get<>(url).subscribe((response: any) => {
    const model: Model = new Model();
    model.Files = [];

    if (response.Information) {
      const information: any = response.Information;
      if (information.Created && information.Version) {
        model.Information = {
          'Created': information.Created,
          'Version': information.Version
        };
      }
    }

    for (const date in data) {
      if (data.File.hasOwnProperty(date)) {
        const file: any = data.File[date];
        model.Files.push({
          'date': date,
          'name': file.name,
          'size': file.size
        });
      } 
    }
  });
}

答案 1 :(得分:0)

Object.keys(o.Files)
  .map(function(k ) {
    return {date: k, name: o.Files[k].name, size: o.Files[k].size}
  });

答案 2 :(得分:0)

它应该看起来像这样:

data: Array<Data>;
    
getData() {
  this.http.get(`url`).subscribe((data) => {
     this.data = data.map(item => {
      const output = {};
      output.information = item.information;
      output.files = Object.keys(item.files).map(key => {
        return {
          date: new Date(key),
          name: item.files[key].name,
          size: item.files[key].size
        };
      });
      return output;
     });
  });
}