Хотя большинство программистов утверждают, что JSON является предпочтительным форматом файла для постоянного хранения данных JavaScript, все же имеет смысл использовать другие форматы для хранения данных. CSV - один из тех форматов, которые существуют уже давно и в большинстве случаев чрезвычайно просты в использовании. Однако, хотя JavaScript предоставляет собственные методы для сериализации и десериализации объектов JSON (JSON.stringify()
и JSON.parse()
), для файлов CSV нет встроенных функций, поэтому в этой статье я попытаюсь реализовать указанные функции в ES6.
Преобразовать массив в CSV
Первый и, возможно, самый простой фрагмент кода, который нам нужно написать, чтобы использовать CSV с JavaScript, - это сериализатор, который преобразует 2D-массив в файл CSV:
Приведенный выше код довольно прост. Он использует Array.map()
и Array.join()
для объединения каждого подмассива в строку, разделяя значения на основе предоставленного delimiter
, затем использует Array.map()
и Array.join()
во второй раз для создания многострочной строки, нашего вывода CSV, со всеми данные массива.
Преобразовать CSV в массив
Сериализовать массив легко, но предположим, что у вас есть файл CSV и вы хотите преобразовать его обратно в массив. В этом случае вам понадобится десериализатор, который отменяет описанный выше процесс:
Процедура здесь по сути такая же, как и раньше, но в обратном порядке. Файл разделяется на строки с помощью String.split()
, затем преобразуется в отдельные значения с помощью String.split()
второй раз на основе предоставленного delimiter
. Последний штрих - позволить пользователю решить, нужно ли пропустить первую строку, поскольку иногда файлы CSV используют первую строку для хранения имен столбцов.
Преобразование CSV в массив объектов
Основываясь на последнем замечании из приведенного выше фрагмента, мы можем легко найти способ преобразования файлов CSV в массив объектов, используя первую строку в качестве имен свойств:
Сейчас это становится более сложным. Первое, что нам нужно сделать, это, очевидно, взять список имен свойств из первой строки, аналогично тому, что мы делали раньше, используя Array.slice()
. Затем идет часть создания объекта, которая выполняется с использованием String.split()
и Array.map()
, как мы делали раньше. Единственное существенное отличие состоит в том, что мы используем Array.reduce()
для создания объекта для каждой строки значений в файле CSV с соответствующими парами ключ-значение. И вуаля! У нас есть массив, полный объектов JavaScript, которые мы теперь можем использовать.
Преобразование массива объектов в CSV
А вот и самая сложная часть - сериализация массива объектов. Почему это сложно и сложно? Потому что иногда у вас есть объекты с другим количеством свойств или чьи свойства расположены в другом порядке. И это создает несколько проблем при попытке сериализации в единую структуру, такую как CSV.
Есть множество способов исправить это, например, сделать определенные предположения о структуре, гарантировать, что объекты имеют одинаковое количество свойств и т. Д., Но наиболее универсальная функция, которую я мог бы написать, требует, чтобы разработчик указал, какие свойства необходимо сериализовать:
Может показаться, что это не так уж много, но здесь происходит довольно много всего. Во-первых, нам нужно создать массив строк для строки CSV и установить первую строку, равную списку свойств, которые мы хотим сериализовать из массива объектов. Затем мы используем Array.map()
и Array.reduce()
для создания каждой строки со свойствами в правильном порядке и пустыми значениями для несуществующих свойств. Наконец, мы используем оператор распространения (…
) и Array.join()
для вывода многострочной CSV-строки.
Соображения и улучшения
Хотя это было краткое руководство по использованию CSV с JavaScript, с этим типом данных можно сделать гораздо больше. Обратите внимание, что все приведенные выше фрагменты не полностью оптимизированы и могут не обрабатывать крайние случаи, поэтому можно было бы начать с них. Другая проблема заключается в том, что между сериализацией и десериализацией существует некоторая несогласованность, поэтому с этим тоже можно справиться. Наконец, вложенные объекты или массивы не могут быть сериализованы ни с одним из этих фрагментов, а CSV изначально не поддерживает их, поэтому для этого можно создать собственные структуры данных для вложения.
Надеюсь, вам понравилось это небольшое руководство. Если да, пожалуйста, хлопните мне в ладоши или пятьдесят! Весь исходный код в этой статье доступен в 30-секундном репозитории кода на GitHub вместе с множеством других фрагментов кода JavaScript для повседневных нужд.