Функции коллекций
В данной статье при описании функций приняты следующие обозначения:
|
Функции для работы с коллекциями предоставляют набор операций для манипуляции массивами и объектами.
Функции извлечения данных
includes
Определяет, включает ли массив значение
указанный элемент
.
Спецификация функции
includes(значение: <массив>, элемент: <любой тип>) :: <логическое значение>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
значение |
массив |
Массив. |
да |
|
элемент |
любое |
Элемент для проверки. |
да |
Примеры
Массив включает
includes(["apple", "orange", "banana"], "banana")
true
keys
Возвращает ключи переданного в функцию объекта.
Спецификация функции
keys(значение: <объект>) :: <массив>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
значение |
объект |
Объект, из которого нужно извлечь ключи. |
да |
Примеры
Получение ключей из объекта.
keys({"key1": "val1", "key2": "val2"})
[ "key1", "key2" ]
length
Возвращает длину значение
.
-
Если
значение
— это массив, возвращает количество элементов. -
Если
значение
— это объект, возвращает количество ключей на верхнем уровне. -
Если
значение
— это строка, возвращает количество байтов в строке. Если вам нужно количество символов, см.strlen
.
Спецификация функции
length(значение: <массив | объект | строка>) :: <целое число>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
значение |
массив объект строка |
Массив или объект |
да |
Примеры
Длина (объект)
length({ "portland": "Trail Blazers", "seattle": "Supersonics" })
2
Длина (вложенный объект)
length({ "home": { "city": "Portland", "state": "Oregon" }, "name": "Trail Blazers", "mascot": { "name": "Blaze the Trail Cat" } })
3
Длина (массив)
length(["Trail Blazers", "Supersonics", "Grizzlies"])
3
Длина (строка)
length("The Planet of the Apes Musical")
30
values
Возвращает значения из переданного в функцию объекта.
Спецификация функции
values(значение: <объект>) :: <массив>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
значение |
объект |
Объект, из которого извлекаются значения. |
да |
Примеры
Получить значения из объекта.
values({"key1": "val1", "key2": "val2"})
[ "val1", "val2" ]
Функции фильтрации
compact
"Уплотняет" значение
, удаляя пустые элементы. В аргументах функции можно указать, какие значения следует считать пустыми.
Спецификация функции
compact(значение: <массив | объект>, [recursive: <логическое значение>, null: <логическое значение>, string: <логическое значение>, object: <логическое значение>, array: <логическое значение>, nullish: <логическое значение>]) :: <массив | объект>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
значение |
массив объект |
Объект или массив для уплотнения. |
да |
|
recursive |
логическое значение |
Будет ли уплотнение рекурсивным, то есть уплотняются ли элементы вложенных объектов и массивов. |
|
нет |
null |
логическое значение |
Должен ли |
|
нет |
string |
логическое значение |
Должна ли пустая строка рассматриваться как пустое значение. |
|
нет |
объект |
логическое значение |
Должен ли пустой объект рассматриваться как пустое значение. |
|
нет |
array |
логическое значение |
Должен ли пустой массив рассматриваться как пустое значение. |
|
нет |
nullish |
логическое значение |
Должны ли рассматриваться "нулевые" значения, которые определены функцией |
|
нет |
Примеры
Сжатие массива
compact(["foo", "bar", "", null, [], "buzz"], string: true, array: true, null: true)
[ "foo", "bar", "buzz" ]
Сжатие объекта
compact({"field1": 1, "field2": "", "field3": [], "field4": null}, string: true, array: true, null: true)
{ "field1": 1 }
filter
Отбирает элементы из коллекции.
Эта функция не поддерживает рекурсивную итерацию.
Функция использует синтаксис замыкания для доступа к ключу и значению или индексу и значению каждого элемента в коллекции.
К блокам замыкания применяются те же правила области видимости, что и к обычным блокам. Они могут использовать любые переменные, определенные в родительских областях видимости, а также сохранять изменения в этих переменных. Однако любые новые переменные, созданные внутри блока замыкания, недоступны за его пределами. |
Спецификация функции
filter(значение: <массив | объект>) -> |<переменная ключа или индекса>, <переменная значения>| { <блок> } :: <массив | объект>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
значение |
массив объект |
Массив или объект для фильтрации. |
да |
Примеры
Фильтрация элементов
filter(array!(.tags)) -> |_index, value| { # оставить элементы, которые не равны "foo" value != "foo" }
[ "bar", "baz" ]
rv_coalesce_nullish
Возвращает первый элемент массива, значение которого не является "nullish", то есть элемент со значимым содержанием. "Nullish" считаются значения:
-
null
; -
"-"
; -
состоящие только из пробелов, то есть символов со свойством Unicode
White_Space
.
Если все значения в массиве являются "nullish", функция возвращает null
.
Спецификация функции
rv_coalesce_nullish(значение: <массив>) :: <любой тип>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
значение |
массив |
массив, в котором производится поиск элементов, не являющихся "nullish" |
да |
Ошибки
Функция rv_coalesce_nullish
может возвращать ошибки, для которых требуется обработка:
-
Значение
не является массивом
Примеры
Есть и значения "nullish", и значимые
rv_coalesce_nullish([" ", "-", "test"])
"test"
Все элементы имеют значимое содержание
rv_coalesce_nullish(["123132", "test"])
"123132"
Все элементы являются "nullish"
rv_coalesce_nullish(["-", " ", "", null, ""])
null
unique
Возвращает уникальные значения для массива.
Сохраняется только первое вхождение каждого элемента.
Спецификация функции
unique(значение: <массив>) :: <массив>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
значение |
массив |
Массив, из которого будут возвращены уникальные элементы. |
да |
Примеры
Уникальные значения
unique(["foo", "bar", "foo", "baz"])
[ "foo", "bar", "baz" ]
Функции действий со всеми элементами
all
Проверяет, что все элементы значения
соответствуют условию, указанному в синтаксисе замыкания
вида |<переменная ключа>, <переменная значения>| { <блок> }
, где:
-
в вертикальные черты заключены аргументы — ключ (для объектов) или индекс (для массивов) и значение элемента;
-
в фигурных скобках указано собственно условие. В условии можно изменять внешние переменные.
Выполнение прекращается при первом значении false
для любого элемента, дальнейшая проверка не производится.
Спецификация функции
all(значение: <массив или объект>) -> |<переменная ключа или индекс>, <переменная значения>| { <блок> } :: <логическое значение>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
значение |
массив или объект |
Массив или объект для проверки |
да |
Примеры
Итерация объекта
all({ "a": 1, "b": 2 }) -> |_key, value| { value > 0 }
true
Итерация массива
all([1, 2, 3, 4, 5]) -> |index, value| { value > 0 }
true
any
Проверяет, что хотя бы один элемент значения
соответствует условию, указанному в синтаксисе замыкания
вида |<переменная ключа>, <переменная значения>| { <блок> }
, где:
-
в вертикальные черты заключены аргументы — ключ (для объектов) или индекс (для массивов) и значение элемента;
-
в фигурных скобках указано собственно условие. В условии можно изменять внешние переменные.
Выполнение прекращается при первом значении true
для любого элемента, дальнейшая проверка не производится.
Спецификация функции
any(значение: <массив или объект>) -> |<переменная ключа или индекс>, <переменная значения>| { <блок> } :: <логическое значение>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
значение |
массив или объект |
Массив или объект для проверки |
да |
Примеры
Итерация объекта
any({ "a": 1, "b": 2 }) -> |_key, value| { value == 2 }
true
Итерация массива
all([1, 2, 3, 4, 5]) -> |index, value| { value == 2 }
true
for_each
Итерирует по коллекции.
В настоящее время функция не поддерживает рекурсивную итерацию.
Функция использует синтаксис замыкания для доступа к ключу и значению или индексу и значению каждого элемента в коллекции.
К блокам замыкания применяются те же правила области видимости, что и к обычным блокам. Они могут использовать любые переменные, определенные в родительских областях видимости, а также сохранять изменения в этих переменных. Однако любые новые переменные, созданные внутри блока замыкания, недоступны за его пределами. |
Спецификация функции
for_each(значение: <массив | объект>) -> |<переменная ключа или индекса>, <переменная значения>| { <блок> } :: <пустое значение>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
значение |
массив объект |
Массив или объект для итерации. |
да |
Примеры
Подсчет элементов
tally = {} for_each(array!(.tags)) -> |_index, value| { # Получение текущего подсчета для `значение` или # установка его в `0`. count = int(get!(tally, [value])) ?? 0 # Увеличение подсчета для значения на `1`. tally = set!(tally, [value], count + 1) } tally
{ "foo": 2, "bar": 1, "baz": 1 }
map_keys
Отображает ключи объекта.
Если включен параметр recursive
, функция проходит внутрь вложенных объектов согласно следующим правилам:
-
Итерация начинается с корневого объекта.
-
Для каждого вложенного объекта:
-
Сначала возвращается ключ самого объекта.
-
Затем происходит рекурсивный вызов функции для объекта, и происходит возврат к пункту 1 в этом списке.
-
Любые изменения, сделанные во вложенном объекте до его рекурсивного вызова, сохраняются.
-
-
Для каждого вложенного массива:
-
Сначала возвращается ключ самого массива.
-
Затем происходит поиск всех объектов внутри массива и применение к каждому из них правил из пункта 2.
-
На практике вышеуказанные правила означают, что map_keys
с включенным параметром recursive
найдет все ключи в целевом объекте, независимо от того, находятся ли вложенные объекты внутри массивов.
Функция использует синтаксис замыкания для доступа к ключу каждого элемента в объекте.
К блокам замыкания применяются те же правила области видимости, что и к обычным блокам. Они могут использовать любые переменные, определенные в родительских областях видимости, а также сохранять изменения в этих переменных. Однако любые новые переменные, созданные внутри блока замыкания, недоступны за его пределами. |
Спецификация функции
map_keys(значение: <объект>, [recursive: <логическое значение>]) -> |<переменная ключа>| { <блок> } :: <объект>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
значение |
объект |
Объект для итерации. |
да |
|
recursive |
логическое значение |
Определяет, следует ли выполнять рекурсивную итерацию по коллекции. |
|
нет |
Примеры
Преобразование ключей в верхний регистр
map_keys(.) -> |key| { upcase(key) }
{ "FOO": "foo", "BAR": "bar" }
Замена точек в ключах на подчеркивания
map_keys(., recursive: true) -> |key| { replace(key, ".", "_") }
{ "labels": { "app_kubernetes_io/name": "mysql" } }
map_values
Отображает значения внутри коллекции.
Если включен параметр recursive
, функция проходит внутрь вложенных коллекций согласно следующим правилам:
-
Итерация начинается с корневой коллекции.
-
Для каждой вложенной коллекции:
-
Сначала возвращается сам тип коллекции.
-
Затем происходит рекурсивный вызов функции для коллекции, и происходит возврат к пункту 1 в этом списке.
-
Любые изменения, сделанные в коллекции до ее рекурсивного вызова, сохраняются.
-
Функция использует синтаксис замыкания, чтобы изменить значение каждого элемента в объекте.
К блокам замыкания применяются те же правила области видимости, что и к обычным блокам. Они могут использовать любые переменные, определенные в родительских областях видимости, а также сохранять изменения в этих переменных. Однако любые новые переменные, созданные внутри блока замыкания, недоступны за его пределами. |
Спецификация функции
map_values(значение: <массив | объект>, [recursive: <логическое значение>]) -> |<переменная значения>| { <блок> } :: <массив | объект>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
значение |
массив объект |
Коллекция (массив или объект) для итерации. |
да |
|
recursive |
логическое значение |
Определяет, следует ли выполнять рекурсивную итерацию по коллекции. |
|
нет |
Примеры
Преобразование значений в верхний регистр
map_values(.) -> |value| { upcase!(value) }
{ "foo": "FOO", "bar": "BAR" }
Функции изменения структуры
chunks
Разбивает значение
на части длиной размер_фрагмента
в байтах.
Спецификация функции
chunks(значение: <массив | строка>, размер_фрагмента: <целое число>) :: <массив> , <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
значение |
массив строка |
Массив байтов или строка для разделения. |
да |
|
размер_фрагмента |
целое число |
Желаемая длина каждого фрагмента в байтах, не менее 1 байта. Длина может быть ограничена архитектурой хост-платформы. |
да |
Ошибки
Функция chunks
может возвращать ошибки, для которых требуется обработка:
-
размер_фрагмента
менее 1 байта. -
размер_фрагмента
слишком велик.
Примеры
Разделение строки на фрагменты
chunks("abcdefgh", 4)
[ "abcd", "efgh" ]
Фрагменты не соблюдают границы кодовой точки Unicode
chunks("ab你好", 4)
[ "ab�", "�好" ]
flatten
Выполняет преобразование значение
в представление с одним уровнем.
Спецификация функции
flatten(значение: <массив | объект>, [separator: <строка>]) :: <массив | объект>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
значение |
массив объект |
Массив или объект, которые необходимо преобразовать. |
да |
|
separator |
строка |
Разделитель, используемый для объединения вложенных ключей. |
|
нет |
Примеры
Преобразование массива
flatten([1, [2, 3, 4], [5, [6, 7], 8], 9])
[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
Преобразование объекта
flatten({ "parent1": { "child1": 1, "child2": 2 }, "parent2": { "child3": 3 } })
{ "parent1.child1": 1, "parent1.child2": 2, "parent2.child3": 3 }
merge
Сливает объект from
в объект to
.
Спецификация функции
merge(to: <объект>, from: <объект>, [deep: <логическое значение>]) :: <объект>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
от |
объект |
Объект, в который выполняется слияние. |
да |
|
до |
объект |
Объект, который выполняет слияние. |
да |
|
deep |
логическое значение |
Выполняется глубокое слияние, если |
|
нет |
Примеры
Слияние объектов (поверхностное)
merge( { "parent1": { "child1": 1, "child2": 2 }, "parent2": { "child3": 3 } }, { "parent1": { "child2": 4, "child5": 5 } } )
{ "parent1": { "child2": 4, "child5": 5 }, "parent2": { "child3": 3 } }
Слияние объектов (глубокое)
merge( { "parent1": { "child1": 1, "child2": 2 }, "parent2": { "child3": 3 } }, { "parent1": { "child2": 4, "child5": 5 } }, deep: true )
{ "parent1": { "child1": 1, "child2": 4, "child5": 5 }, "parent2": { "child3": 3 } }
rv_rename_keys
Переименовывает ключи в объекте согласно таблице обогащения.
Спецификация функции
rename_keys(значение: <объект>, table: <строка>, from: <строка>, to <строка>, [separator: <строка>, join_separator: <строка>, case_sensitive: <логическое>]) :: <объект> , <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
значение |
объект |
Объект, в котором нужно переименовать поля. |
да |
|
table |
строка |
Таблица обогащения. |
да |
|
from |
строка |
Колонка с текущими именами. |
да |
|
to |
строка |
Колонка с новыми именами. |
да |
|
separator |
строка |
Строка, разделяющая части сложных ключей. |
нет |
|
join_separator |
строка |
Строка, соединяющая части сложных ключей после переименования. Если параметр не указан, то используется значение |
нет |
|
case_sensitive |
логическое значение |
Указывает, будет ли поиск ключей в таблице обогащения регистрозависимым. |
false |
нет |
Ошибки
Функция rv_rename_keys
может возвращать ошибки, для которых требуется обработка:
-
Не найдена таблица обогащения.
-
Таблица не закодирована в UTF-8.
-
case_sensitive
не является логическим значением. -
from
не является строкой -
to
не является строкой -
separator
не является строкой. -
join_separator
не является строкой. -
Указан
join_separator
без параметраseparator
. -
Не удаётся разобрать таблицу.
Примеры
rename_keys!( { "a/b": 123 }, table: "table_name", from: "from_value", to: "to_value", separator: "/" )
{ "c/d": 123 }
unnest
"Разворачивает" поле объекта, которое является массивом. В результате функция возвращает массив объектов, в каждом объекте значением указанном поля будет один из элементов массива, значения остальных полей сохраняются прежними. Это аналог "explode" в некоторых языках.
Присваивание возвращенного массива корневому пути .
приведет к созданию нескольких событий из remap
.
Спецификация функции
unnest(path: <путь>) :: <массив> , <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
путь |
путь |
Путь к полю, которое нужно развернуть. |
да |
Ошибки
Функция unnest
может возвращать ошибки, для которых требуется обработка:
-
Поле, на которое ссылается путь, не является массивом.
Примеры
Развернуть поле
. = {"hostname": "localhost", "events": [{"message": "hello"}, {"message": "world"}]} . = unnest(.events)
[{"hostname": "localhost", "events": {"message": "hello"}}, {"hostname": "localhost", "events": {"message": "world"}}]
Раскроить вложенное поле
. = unnest!(.event.messages)
Функции действий с отдельными элементами
append
Добавляет каждый элемент из массива элементы
в конец массива значение
.
Спецификация функции
append(значение: <массив>, элементы: <массив>) :: <массив>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
значение |
массив |
Исходный массив |
да |
|
элементы |
массив |
Элементы для добавления |
да |
Примеры
Добавление в массив
append([1, 2], [3, 4])
[ 1, 2, 3, 4 ]
del
Удаляет из цели поле, указанное статическим path
.
Для удаления динамического пути см. функцию remove
.
Спецификация функции
del(path: <путь>, [compact: <логическое значение>]) :: <любой тип>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
путь |
путь |
Путь к удаляемому полю. |
да |
|
compact |
логическое значение |
Если |
|
нет |
Примечания
У этой функции есть особое поведение, о котором стоит знать:
-
Функция
del
модифицирует текущее событие и возвращает значение удаленного поля.
Примеры
Удаление поля
del(.field1)
Переименование поля
.new_field = del(.old_field)
exists
Проверяет, существует ли путь в цели.
Эта функция различает отсутствующий путь и путь со значением null
. Обычное выражение пути, такое как .foo
, не может различить эти случаи, так как он всегда возвращает значение null
, если путь не существует.
Спецификация функции
exists(путь: <путь>) :: <логическое значение>
Примеры
Проверка существования поля
exists(.field)
true
Проверка существования элемента массива
exists(.array[2])
true
get
Динамически получает значение по указанному пути.
Когда вы знаете путь, который вы хотите найти, вы должны использовать статические пути, такие как .foo.bar[1]
, чтобы получить значение этого пути. Однако, когда вы не знаете заранее имена путей, вы можете использовать динамическую функцию get
, чтобы получить значение по запросу.
Спецификация функции
get(значение: <объект | массив>, путь: <массив>) :: <любой тип>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
значение |
объект массив |
Объект или массив для запроса. |
да |
|
path |
массив |
Массив из сегментов пути для поиска значения. |
да |
Ошибки
Функция get
может возвращать ошибки, для которых требуется обработка:
-
Сегмент пути должен быть либо "строкой", либо "целым числом".
Примеры
Поле верхнего уровня с одним сегментом
get!(значение: { "foo": "bar" }, path: ["foo"])
bar
Вложенное поле с несколькими сегментами
get!(значение: { "foo": { "bar": "baz" } }, path: ["foo", "bar"])
baz
Индексирование массива
get!(значение: ["foo", "bar", "baz"], path: [-2])
bar
push
Добавляет item
в конец массива значение
.
Спецификация функции
push(значение: <массив>, item: <любой тип>) :: <массив>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
значение |
массив |
Целевой массив. |
да |
|
item |
любое |
Элемент для добавления. |
да |
Примеры
Добавление элемента в массив
push([1, 2], 3)
[ 1, 2, 3 ]
remove
Динамически удаляет значение по указанному пути.
Когда вы знаете путь, который хотите удалить, используйте функцию del
и статические пути, такие как del(.foo.bar[1])
, чтобы удалить значение по этому пути. Функция del
возвращает удаленное значение и является более производительной, чем эта функция. Однако, когда вы не знаете заранее имена путей, вы можете использовать эту динамическую функцию для удаления значения по указанному пути.
Спецификация функции
remove(значение: <объект | массив>, path: <массив>, [compact: <логическое значение>]) :: <объект | массив>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
значение |
объект массив |
Объект или массив, из которого требуется удалить данные. |
да |
|
path |
массив |
Массив сегментов пути для удаления значения. |
да |
|
compact |
логическое значение |
Определяет, следует ли после удаления удалять пустые объекты или массивы. |
|
нет |
Ошибки
Функция remove
может возвращать ошибки, для которых требуется обработка:
-
сегмент пути должен быть либо "строкой", либо "целым числом"
Примеры
Удаление значения односегментного поля верхнего уровня
remove!(значение: { "foo": "bar" }, path: ["foo"])
{}
Удаление значения многосегментного вложенного поля
remove!(значение: { "foo": { "bar": "baz" } }, path: ["foo", "bar"])
{ "foo": {} }
Индексирование массива
remove!(значение: ["foo", "bar", "baz"], path: [-2])
[ "foo", "baz" ]
Удаление с уплотнением
remove!(значение: { "foo": { "bar": [42], "baz": true } }, path: ["foo", "bar", 0], compact: true)
{ "foo": { "baz": true } }
set
Динамически вставляет данные в указанный путь объекта или массива.
Когда вы знаете путь, которому хотите присвоить значение, следует использовать статические пути, такие как .foo.bar[1] = true
, для улучшения производительности и читаемости. Однако, когда вы не знаете заранее имена путей, вы можете использовать эту динамическую функцию вставки для вставки данных в объект или массив.
Спецификация функции
set(value: <объект | массив>, path: <массив>, data: <любой тип>) :: <объект | массив>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
value |
объект массив |
Объект или массив для вставки данных. |
да |
|
path |
массив |
Массив сегментов пути для вставки значения. |
да |
|
data |
любое |
Вставляемые данные. |
да |
Ошибки
Функция set
может возвращать ошибки, для которых требуется обработка:
-
сегмент пути должен быть либо "строкой", либо "целым числом"
Примеры
Вставка значения в односегментное поле верхнего уровня
set!(value: { "foo": "bar" }, path: ["foo"], data: "baz")
{ "foo": "baz" }
Вставка значения в многосегментное вложенное поле
set!(значение: { "foo": { "bar": "baz" } }, path: ["foo", "bar"], data: "qux")
{ "foo": { "bar": "qux" } }
Массив
set!(value: ["foo", "bar", "baz"], path: [-2], data: 42)
[ "foo", 42, "baz" ]