如何在TypeScript中将对象从硬编码更改为动态属性

时间:2019-03-26 20:11:19

标签: angular typescript

在Visual Studio MVC应用程序中使用TypeScript 2.2和Angular,我有一个对象(“标头”)存储一组数据的标头名称。该对象当前是高级硬编码的。我需要更改它以根据数据动态填充。最终,此数据导出到CSV。当前,代码类似于以下内容:

let output = (this.allData);
let headers = {};
let formattedItems = [];
let csvData: any;
let fileName = "file.xls";
headers = {
   customerName = "CustomerName",
   productName1 = "Product Name 1",  
   productName2 = "Product Name 2",
   monthYear = "Month/Year"   
};
output.forEach((item) => {
     formattedItems.push ({
     customerName:  (item.Id > 0 ) ? item.Name : '',     
     productName1:  (item.Id > 0 ) ? item.Count : '',     
     productName2:  (item.Id > 0 ) ? item.Count : '',   
     monthYear:   (item.Id > 0 ) ? item.SaleDate: '',  
  });
});
csvData = this.exportCsv(headers, formattedItems);
this.exportCSV(csvData, fileName);

我需要修改代码以执行以下操作:

  1. 循环浏览数据
  2. 首先,获取列名
  3. 秒,相应地追加数据行

    标题= {     customerName =“ CustomerName”,      //如果(columnName如“产品”)      //然后创建新的列名;     monthYear =“月/年”
    };

生成的文件将从只有两个“产品名称”列更改为

|客户名称|耐克鞋|阿迪达斯鞋| 2012年3月

可变数量的“产品名称”列:

|客户名称|耐克鞋|阿迪达斯鞋|锐步鞋|新百伦鞋|    2012年3月

1 个答案:

答案 0 :(得分:0)

我最终将标头更改为数组,然后将数据动态添加到数组的末尾:

let headers = [];
headers = ['CustomerName', 'Month/Year' ]
output.forEach((item) => {
    formattedItems.push ({
    customerName:  (item.Id > 0 ) ? item.Name : '',          
    monthYear:   (item.Id > 0 ) ? item.SaleDate: '',  
  });
});
//Dynamically add an extra column for each product
for (let x = 0; itemsFormatted.length > x; x++) {
  for (let y = 0; this.products.length > y; y++) {
      if (x == 0) {
        //Add new header name to array
        headers.push(this.companyOnboarders[y].name);
      }
       //Add data for corresponding header
       itemsFormatted[x][this.products[y].name] = this.products[y].count
   }
}

 csvData = this.exportCsv(headers, formattedItems);
 this.exportCSV(csvData, fileName);