Как разобрать строку в не тип - PullRequest
0 голосов
/ 10 сентября 2018

Я анализирую 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<T>(csvData), могу ли я сделать что-то вроде:

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

Но T [header [j]] не проходит компиляцию.

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Я бы сделал что-нибудь более функциональное.

//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);
0 голосов
/ 10 сентября 2018

Если вам не нужно знать тип (и вы на самом деле не пытаетесь получить значение свойства с неизвестным типом), тогда вы можете использовать «неизвестный» тип https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-0.html

Это намного лучше, чем "любой", и вы можете ввести данные в тот момент, когда вам нужно их получить.

0 голосов
/ 10 сентября 2018

Попробуйте использовать тип 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...