Как разобрать строку без типа

Я разбираю файл 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 представляют собой строки. Я думаю, это потому, что функция разделения делает его строкой?

По желанию: Я могу передать тип в эту функцию, например readCsvFile<T>(csvData), могу ли я сделать что-нибудь вроде:

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

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

«потому что я не знаю конкретного типа каждой переменной». Что ж, вам нужен способ узнать, если это CSV, тогда каждый столбец ссылается на поле, тип которого вы знаете.

mpm 10.09.2018 17:19

Я обновил более подробную информацию о коде. У меня есть способ узнать тип, но я хочу сделать эту функцию более общей.

Auggie Li 10.09.2018 17:22

Итак, в чем вопрос? Javascript не имеет типов (и машинописный текст тоже, поскольку это просто надмножество). Если вы не хотите приводить их к какому-либо типу, просто назначьте их или преобразуйте их в строку, если вы хотите, чтобы все они были строками. Однако было бы гораздо разумнее следовать подсказке @mpm, поскольку вам все равно придется разбирать их позже.

briosheje 10.09.2018 17:23

@DanielGale Обновил вопрос. В каждом столбце один и тот же тип. Я могу передать общий тип класса, как проверить тип каждого свойства?

Auggie Li 10.09.2018 17:34

@briosheje Я думал, что это не должно быть типа. Однако, когда я передаю значения в класс, все типы будут строковыми, даже если тип свойства - число.

Auggie Li 10.09.2018 17:35

@AuggieLi javascript не знает, является ли импортируемый вами тип числовым или нет. Я имел в виду, что и машинописный текст, и javascript во время выполнения не имеют типа. Следовательно, вам не нужно работать с «без типа» (определенным как «любой» в машинописном тексте), поскольку они уже будут такими (либо строковыми, либо любыми). Предлагаю вам последовать идее mpm, это самое умное и надежное решение, imho.

briosheje 10.09.2018 17:42

Просто не смешивайте JSON и CSV ... если вам нужно текстовое представление, которое изначально анализирует не-строковые типы, просто используйте JSON. Если вам нужна таблица значений, используйте CSV. Никогда не должно быть ситуации, когда вы не знаете типы в каждом столбце вашей таблицы.

Patrick Roberts 10.09.2018 17:50

@briosheje Если я передаю значение в класс и не использую parseInt / parseFloat, это тип, который по умолчанию обрабатывается как строка, даже если тип свойства класса - число? Я могу передать данные JSON в класс без какого-либо типа, но на этот раз все данные JSON представляют собой строки.

Auggie Li 10.09.2018 17:50

@ Патрик Роберт Обновил вопрос. Можно ли каким-то образом преобразовать csv в JSON, но данные не имеют строкового типа. (как я уже упоминал в вопросе, на этот раз все типы данных JSON - это строки)

Auggie Li 10.09.2018 17:55

@AuggieLi: Да, если вы явно укажете машинописному тексту, что свойство класса является числом, во время выполнения это будет просто Не важно. Он просто НЕ будет использовать его для вас, он НЕ позволит вам явно установить значение в вашем коде, но он не будет предотвращает во время выполнения, что эта переменная не будет объявленным типом. Помните: это просто надмножество javascript, он не сделает для вас никакого волшебства, javascript является без типа, поэтому машинописный текст (он просто "строго типизирован", даже не совсем. Кроме того, вы можете назначить тип "любой" типу тип "номер").

briosheje 11.09.2018 10:26

@briosheje Проблема в том, что значение, полученное из csv, является строкой. Думаю, даже если я передал их в переменную 'any', они все равно будут строками. Есть ли способ преобразовать эти значения в «любой» или неизвестный тип?

Auggie Li 11.09.2018 20:35

@AuggieLi: Нет, нет способа сделать это, потому что any - это общий тип, который указывает все возможные типы. Вы не можете явно привести к «неизвестному» типу, вы можете иметь дело с неизвестными типами, купить не могу создать неизвестный тип, потому что его просто не существует.

briosheje 12.09.2018 09:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
12
79
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте использовать тип любой для своих атрибутов.

// 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 <T> (csvData)? Конструктор класса может быть разным.

Auggie Li 10.09.2018 17:37

да, вы можете использовать что-то подобное, проверьте документацию по машинописному тексту, там есть несколько примеров typescriptlang.org/docs/handbook/generics.html

hamilton.lima 10.09.2018 17:57
Ответ принят как подходящий

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

//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.info(linesAsObjects);

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

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

Думаю, это лучшее решение проблемы. Однако я использую Angular, который еще не обновлен до Typescript 3.0.

Auggie Li 11.09.2018 07:41

Другие вопросы по теме