Строковые функции

В экосистеме Vega и Vega-Lite работа со строками строится на основе выражений (expression language), унаследованных от JavaScript-подобного синтаксиса, но ограниченных безопасным и предсказуемым набором функций. Строковые функции применяются в сигналах (signals), вычисляемых полях (calculate transforms), фильтрации данных и формировании динамических подписей визуализаций.

Строковые операции в Vega реализуются не через стандартные методы JavaScript, а через встроенный набор функций expression language. Все функции работают в контексте чистых выражений без побочных эффектов, что позволяет безопасно вычислять значения прямо в спецификации визуализации.

Строки в выражениях:

  • всегда являются примитивными значениями;
  • не имеют доступа к прототипу JavaScript;
  • обрабатываются через набор детерминированных функций;
  • могут комбинироваться с арифметическими и логическими операторами.

Ключевая особенность — единый синтаксис для всех преобразований данных, включая строки, числа и массивы.

Преобразование регистра

Одними из наиболее часто используемых строковых функций являются функции изменения регистра.

toUpperCase() и toLowerCase()

Используются для нормализации текстовых данных:

  • toUpperCase(str) — перевод строки в верхний регистр
  • toLowerCase(str) — перевод строки в нижний регистр

Пример логики выражения:

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

В выражениях Vega:

  • toUpperCase(datum.category)
  • toLowerCase(signal:query)

Эти функции часто применяются перед агрегацией данных, чтобы избежать расхождений в строковых ключах.

Извлечение подстрок

Работа с частями строк реализуется через функцию:

substring(str, start, end)

Поведение:

  • start — индекс начала (включительно)
  • end — индекс конца (не включительно)

Если end не задан, подстрока берётся до конца строки.

Использование:

  • извлечение кодов регионов;
  • обработка дат в строковом формате;
  • разбиение составных идентификаторов.

Пример:

  • substring(datum.code, 0, 3)
  • substring(datum.timestamp, 0, 10)

Функция строго индексная, без поддержки отрицательных значений (в отличие от JavaScript slice).

Поиск в строках

Для анализа текстовых данных используются функции поиска:

indexof(str, substring)

Возвращает:

  • индекс первого вхождения подстроки;
  • -1, если совпадение отсутствует.

Применение:

  • фильтрация текстовых записей;
  • проверка наличия ключевых слов;
  • построение условных визуальных фильтров.

Пример:

  • indexof(datum.label, "error") >= 0

Функция часто используется в сочетании с логическими выражениями для построения сложных условий фильтрации.

Замена подстрок

replace(str, pattern, replacement)

Позволяет выполнять замену фрагментов строк.

Особенности:

  • поддержка регулярных выражений;
  • глобальная или частичная замена в зависимости от шаблона;
  • результат всегда возвращает новую строку.

Примеры использования:

  • очистка данных;
  • удаление символов форматирования;
  • нормализация строковых идентификаторов.

Пример выражения:

  • replace(datum.name, /_/g, " ")

Эта функция часто применяется перед визуализацией категориальных подписей.

Разбиение и объединение строк

split(str, delimiter)

Разделяет строку на массив подстрок.

Используется для:

  • обработки CSV-подобных полей;
  • разбиения составных значений;
  • преобразования строковых списков в массивы.

Пример:

  • split(datum.tags, ",")

join(array, delimiter)

Объединяет массив строк в одну строку.

Пример:

  • join(datum.categories, " / ")

Эти функции особенно важны при работе с агрегированными данными в Vega-Lite, где трансформации часто приводят к массивам значений.

Очистка строк

trim(str)

Удаляет пробелы в начале и конце строки.

Применение:

  • нормализация пользовательского ввода;
  • очистка импортированных данных;
  • устранение ошибок сравнения строк.

Пример:

  • trim(datum.label)

В сочетании с lower/upper case используется как базовый шаг подготовки данных.

Длина строки

length(str)

Возвращает количество символов.

Использование:

  • фильтрация коротких или длинных строк;
  • оценка полноты данных;
  • управление отображением подписей.

Пример:

  • length(datum.comment) > 10

Функция работает с Unicode-строками, но поведение может отличаться в зависимости от кодовых точек.

Форматирование строк

Строковая интерполяция в Vega реализуется через оператор сложения:

  • "text " + datum.value

Это базовый механизм построения динамических подписей.

Использование:

  • подписи осей;
  • tooltips;
  • динамические легенды.

Пример:

  • "Value: " + datum.count

Для сложного форматирования часто комбинируется с функциями преобразования чисел.

Работа со строками в calculate transform

В Vega и Vega-Lite строковые функции наиболее часто применяются внутри transform типа calculate.

Структура:

  • вычисление нового поля на основе выражения;
  • сохранение результата в dataset.

Пример логики:

  • нормализация текста;
  • создание категорий;
  • генерация ключей группировки.

Типичный сценарий:

  • calculate: "toLowerCase(datum.city)"

или комбинированные выражения:

  • "trim(toUpperCase(datum.name))"

Строки в фильтрации данных

Функции строк активно используются в transform filter.

Примеры логики:

  • поиск подстроки:

    • indexof(datum.text, "warning") > -1
  • проверка префикса через substring:

    • substring(datum.code, 0, 2) === "US"
  • комбинированная нормализация:

    • toLowerCase(trim(datum.label)) === "active"

Фильтрация на строках часто служит основой интерактивных визуализаций.

Сложные композиции строковых функций

Строковые функции могут вкладываться друг в друга, образуя цепочки преобразований:

  • trim(toLowerCase(replace(datum.name, /-/g, " ")))

Такие конструкции применяются для:

  • стандартизации входных данных;
  • подготовки ключей для группировки;
  • устранения неоднородности источников данных.

Ограничения строковых функций

Строковая система выражений в Vega имеет ряд ограничений:

  • отсутствие полноценного API регулярных выражений JavaScript;
  • ограниченный набор методов;
  • невозможность побочных эффектов;
  • отсутствие доступа к внешним объектам;
  • упрощённая модель Unicode-обработки.

Эти ограничения обеспечивают предсказуемость вычислений в декларативной системе визуализации.

Строки в сигналах (signals)

В сигналах строковые функции используются для динамического управления интерфейсом визуализации.

Примеры сценариев:

  • формирование подписей кнопок;
  • динамическое отображение значений;
  • переключение режимов отображения.

Пример выражения сигнала:

  • signal: "toUpperCase(userInput)"

или комбинированно:

  • "Selected: " + datum.category

Сигналы позволяют обновлять строковые значения в реальном времени без пересборки всей визуализации.

Взаимодействие со шкалами и подписями

Строковые функции часто участвуют в формировании текстов осей и легенд.

Примеры:

  • нормализация категорий перед отображением;
  • сокращение длинных подписей;
  • добавление префиксов и суффиксов.

Типичный паттерн:

  • "Category: " + toUpperCase(datum.key)

или

  • substring(datum.label, 0, 15) + "..."

Такие преобразования позволяют управлять читаемостью визуальных компонентов без изменения исходных данных.