如何将字符串解析为无类型

Posted

技术标签:

【中文标题】如何将字符串解析为无类型【英文标题】:How to parse a string into no type 【发布时间】:2019-02-15 01:39:44 【问题描述】:

我正在解析一个 csv 文件:

    let lines = csvData.split(/\r\n|\n/);
    let headers = lines[0].split(',');
    for (let i = 1; i < lines.length; i++) 
      let values = lines[i].split(',');
      let item = ;
      for (let j = 0; j < headers.length; j++) 
        item[headers[j]] = values[j];
      
      items.push(item);
    
    return items;

我正在获取它的数据。但是,数据都是字符串。我想将它们传递给 JSON,并使它们没有类型,所以我可以将它们传递给不同类型的变量。我不想直接使用parseInt/parseFloat,因为我不知道每个变量的具体类型。

但是,每次我将值传递给 JSON 时,它们都是字符串,例如“1234”,而不是1234。通常我可以将JSON数据传递给没有类型的类,但是这次我将csvData转换为JSON,JSON数据都是字符串。我猜是因为 split 函数把它变成了一个字符串?

可选: 我可以将类型传递给这个函数,比如readCsvFile&lt;T&gt;(csvData),我可以这样做:

    if (typeof(T[headers[j]]) == 'number') 
      item[headers[j]] = parseFloat(values[j]);
     else 
      item[headers[j]] = values[j];
    

但是 T[header[j]] 没有通过编译。

【问题讨论】:

"因为我不知道每个变量的具体类型。"好吧,您需要一种方法来找出,如果它是 CSV,那么每一列都引用一个您知道类型的字段。 我更新了代码的更多细节。我有办法知道类型,但我想让这个函数更通用。 那么,问题是什么? javascript 是无类型的(打字稿也是,因为它只是一个超集)。如果您不想将它们转换为任何类型,只需分配它们,或者如果您希望它们全部为字符串,则将它们转换为字符串。但是,遵循@mpm 的提示会更有意义,因为您仍然需要稍后解析它们。 @DanielGale 更新了问题。它在每一列中都是相同的类型。我可以传入一个泛型类类型,如何检查每个属性的类型? @briosheje 我认为它不应该是类型。但是,当我将值传递给一个类时,所有类型都将是字符串,即使属性类型是数字。 【参考方案1】:

我会做一些更实用的事情。

//Define variables
var csvData = "field1a,field2a,field3a\r\nfield1b,field2b,field3b";
var linesAsObjects = [];
var lines = csvData.split(/\r\n|\n/);

//Split fields here
var splitFields = function(line)
  let fields = line.split(',');
  addItem(fields);


// Assign field values to object or formatting here
var addItem = function(fields)
  let obj = ;
  obj.field1 = fields[0];
  obj.field2 = fields[1];
  obj.field3 = fields[2];

  linesAsObjects.push(obj);


// Call the code for each line
lines.forEach(splitFields);

//Printing lines and fields as assigned to an object.
console.log(linesAsObjects);

【讨论】:

【参考方案2】:

如果您不需要知道类型(并且您实际上并没有尝试获取未知类型的属性的值),那么您可以使用“未知”类型https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-0.html

这比“any”要好得多,您可以在需要的地方键入数据。

【讨论】:

我认为这是解决问题的最佳解决方案。但是,我使用的是 Angular,它还没有更新到 Typescript 3.0。【参考方案3】:

尝试使用 type any 作为属性。

// add the fields you have from the CSV
class ResultFromCSV 
  myValue: any;
  otherValue: any;


...
let lines = csvData.split(/\r\n|\n/);
    let headers = lines[0].split(',');
    for (let i = 1; i < lines.length; i++) 
      let values = lines[i].split(',');

      // instantiate here
      let item = new ResultFromCSV();
      for (let j = 0; j < headers.length; j++) 
        item[headers[j]] = values[j];
      
      items.push(item);
    
    return items;

【讨论】:

是不是要让它通用,这个函数就像readCsvFile(csvData)?类的构造函数可能会有所不同。 是的,你可以使用类似的东西,检查打字稿文档,那里有几个例子typescriptlang.org/docs/handbook/generics.html

以上是关于如何将字符串解析为无类型的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串转换为无符号字符数组 [关闭]

如何将带有尾随x的数字字符串转换为无符号数字列表

如何将十六进制字符串转换为无符号字符数组?

将图像转换为无符号字符*

C++ 使用 istringstream 将整数读取为无符号字符

如何将以“\ 0”开头的char *转换为无符号整数? [关闭]