Функции коллекций
В данной статье при описании функций приняты следующие обозначения:
|
Функции для работы с коллекциями предоставляют набор операций для манипуляции массивами и объектами.
Функции извлечения данных
includes
Определяет, включает ли массив value
указанный элемент (element
).
Спецификация функции
includes(value: <массив>, element: <любой тип>) :: <логическое значение>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
массив |
Массив. |
да |
|
|
любое |
Элемент для проверки. |
да |
Примеры
Массив включает
includes(["apple", "orange", "banana"], "banana")
true
keys
Возвращает ключи переданного в функцию объекта.
Спецификация функции
keys(value: <объект>) :: <массив>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
объект |
Объект, из которого нужно извлечь ключи. |
да |
Примеры
Получение ключей из объекта.
keys({"key1": "val1", "key2": "val2"})
[ "key1", "key2" ]
length
Возвращает длину value
. Результат зависит от типа value
:
-
для массива возвращает количество элементов;
-
для объекта возвращает количество ключей на верхнем уровне;
-
для строки возвращает количество байтов в строке. Если нужно получить количество символов, используйте функцию
strlen
.
Спецификация функции
length(value: <массив | объект | строка>) :: <целое число>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
массив объект строка |
Массив или объект |
да |
Примеры
Длина (объект)
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(value: <объект>) :: <массив>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
объект |
Объект, из которого извлекаются значения. |
да |
Примеры
Получить значения из объекта.
values({"key1": "val1", "key2": "val2"})
[ "val1", "val2" ]
Чтобы получить срез массива, используйте функцию slice .
|
Функции фильтрации
compact
"Уплотняет" value
, удаляя пустые элементы. В аргументах функции можно указать, какие значения следует считать пустыми.
Спецификация функции
compact(value: <массив | объект>, [recursive: <логическое значение>, null: <логическое значение>, string: <логическое значение>, object: <логическое значение>, 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(value: <массив | объект>) -> |<переменная ключа или индекса>, <переменная значения>| { <блок> } :: <массив | объект>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
массив объект |
Массив или объект для фильтрации. |
да |
Примеры
Фильтрация элементов
filter(array!(.tags)) -> |_index, value| { # оставить элементы, которые не равны "foo" value != "foo" }
[ "bar", "baz" ]
rv_coalesce_nullish
Возвращает первый элемент массива, значение которого не является "nullish", то есть элемент со значимым содержанием. "Nullish" считаются значения:
-
null
; -
"-"
; -
состоящие только из пробелов, то есть символов со свойством Unicode
White_Space
.
Если все значения в массиве являются "nullish", функция возвращает null
.
Спецификация функции
rv_coalesce_nullish(value: <массив>) :: <любой тип>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
массив |
массив, в котором производится поиск элементов, не являющихся "nullish" |
да |
Ошибки
Функция rv_coalesce_nullish
может возвращать ошибки, для которых требуется обработка:
-
value
не является массивом
Примеры
Есть и значения "nullish", и значимые
rv_coalesce_nullish([" ", "-", "test"])
"test"
Все элементы имеют значимое содержание
rv_coalesce_nullish(["123132", "test"])
"123132"
Все элементы являются "nullish"
rv_coalesce_nullish(["-", " ", "", null, ""])
null
unique
Возвращает уникальные значения для массива.
Сохраняется только первое вхождение каждого элемента.
Спецификация функции
unique(value: <массив>) :: <массив>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
массив |
Массив, из которого будут возвращены уникальные элементы. |
да |
Примеры
Уникальные значения
unique(["foo", "bar", "foo", "baz"])
[ "foo", "bar", "baz" ]
Функции действий со всеми элементами
all
Проверяет, что все элементы value
соответствуют условию, указанному в синтаксисе замыкания
вида |<переменная ключа>, <переменная значения>| { <блок> }
, где:
-
в вертикальные черты заключены аргументы — ключ (для объектов) или индекс (для массивов) и значение элемента;
-
в фигурных скобках указано собственно условие. В условии можно изменять внешние переменные.
Выполнение прекращается при первом значении false
для любого элемента, дальнейшая проверка не производится.
Спецификация функции
all(value: <массив или объект>) -> |<переменная ключа или индекс>, <переменная значения>| { <блок> } :: <логическое значение>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
массив или объект |
Массив или объект для проверки |
да |
Примеры
Итерация объекта
all({ "a": 1, "b": 2 }) -> |_key, value| { value > 0 }
true
Итерация массива
all([1, 2, 3, 4, 5]) -> |index, value| { value > 0 }
true
any
Проверяет, что хотя бы один элемент value
соответствует условию, указанному в синтаксисе замыкания
вида |<переменная ключа>, <переменная значения>| { <блок> }
, где:
-
в вертикальные черты заключены аргументы — ключ (для объектов) или индекс (для массивов) и значение элемента;
-
в фигурных скобках указано собственно условие. В условии можно изменять внешние переменные.
Выполнение прекращается при первом значении true
для любого элемента, дальнейшая проверка не производится.
Спецификация функции
any(value: <массив или объект>) -> |<переменная ключа или индекс>, <переменная значения>| { <блок> } :: <логическое значение>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
массив или объект |
Массив или объект для проверки |
да |
Примеры
Итерация объекта
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(value: <массив | объект>) -> |<переменная ключа или индекса>, <переменная значения>| { <блок> } :: <пустое значение>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
массив объект |
Массив или объект для итерации. |
да |
Примеры
Подсчет элементов
tally = {} for_each(array!(.tags)) -> |_index, value| { # Получение текущего подсчета для `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(value: <объект>, [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(value: <массив | объект>, [recursive: <логическое значение>]) -> |<переменная значения>| { <блок> } :: <массив | объект>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
массив объект |
Коллекция (массив или объект) для итерации. |
да |
|
|
логическое значение |
Определяет, следует ли выполнять рекурсивную итерацию по коллекции. |
|
нет |
Примеры
Преобразование значений в верхний регистр
map_values(.) -> |value| { upcase!(value) }
{ "foo": "FOO", "bar": "BAR" }
match_datadog_query
Сопоставляет объект value
с запросом Datadog Search Syntax.
Спецификация функции
match_datadog_query(value: <объект> , query: <строка> ) :: <логическое значение>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
объект |
Коллекция (объект) |
да |
|
|
строка |
Запрос Datadog Search Syntax |
да |
Примеры
Запрос OR
match_datadog_query({"message": "contains this and that"}, "this OR that")
true
Запрос AND
match_datadog_query({"message": "contains only this"}, "this AND that")
false
Символ подстановки в атрибутах
match_datadog_query({"name": "foobar"}, "@name:foo*")
true
Диапазон тегов
match_datadog_query({"tags": ["a:x", "b:y", "c:z"]}, s'b:["x" TO "z"]')
true
Чтобы объединить все элементы массива в одну строку, используйте функцию join .
|
Функции изменения структуры
chunks
Разбивает value
на части длиной chunk_size
в байтах.
Спецификация функции
chunks(value: <массив | строка>, chunk_size: <целое число>) :: <массив> , <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
массив строка |
Массив байтов или строка для разделения. |
да |
|
|
целое число |
Желаемая длина каждого фрагмента в байтах, не менее 1 байта. Длина может быть ограничена архитектурой хост-платформы. |
да |
Характеристики функции
При делении на фрагменты границы кодовых точек Unicode не соблюдаются.
Ошибки
Функция chunks
может возвращать ошибки, для которых требуется обработка:
-
chunk_size
менее 1 байта. -
chunk_size
слишком велик.
Примеры
Разделение строки на фрагменты
chunks("abcdefgh", 4)
[ "abcd", "efgh" ]
Деление без учета границ кодовой точки Unicode
chunks("ab你好", 4)
[ "ab�", "�好" ]
flatten
Выполняет преобразование value
в представление с одним уровнем.
Спецификация функции
flatten(value: <массив | объект>, [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 }
unflatten
Преобразует value
во вложенное представление. Функция может быть полезна для возвращения плоского объекта, полученного с помощью функции flatten, в исходную форму.
Спецификация функции
unflatten(value: <объект>, [separator: <строка>, recursive: <логическое значение>]) :: <объект>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
объект |
Массив или объект, которые необходимо преобразовать. |
да |
|
|
строка |
Разделитель, используемый для разделения ключей. |
|
нет |
|
логическое значение |
Требуется ли рекурсивно преобразовывать значения объекта. |
|
нет |
Примеры
Преобразование во вложенное представление
unflatten({ "foo.bar.baz": true, "foo.bar.qux": false, "foo.quux": 42 })
{ "foo": { "bar": { "baz": true, "qux": false }, "quux": 42 } }
Рекурсивное преобразование во вложенное представление
unflatten({ "flattened.parent": { "foo.bar": true, "foo.baz": false } })
{ "flattened": { "parent": { "foo": { "bar": true, "baz": false } } } }
Нерекурсивное преобразование во вложенное представление
unflatten({ "flattened.parent": { "foo.bar": true, "foo.baz": false } }, recursive: false)
{ "flattened": { "parent": { "foo.bar": true, "foo.baz": false } } }
Игнорирование неконсистентных значений ключей
Если у нескольких значений один и тот же ключ является префиксом, значения ключей верхнего уровня вложенности отбрасываются, и сохраняется только вложенный объект.
В примере ниже для ключа а
есть два возможных значения — число 3 и объект с ключами b
и c
. При применении функции unflatten
числовое значение отбрасывается, сохраняется только объект.
unflatten({ "a": 3, "a.b": 2, "a.c": 4 })
{ "a": { "b": 2, "c": 4 } }
merge
Обновляет поля в объекте to
на основе содержимого объекта from
. При этом:
-
Поля, которые есть только в одном из объектов, возвращаются в результирующем объекте без изменений.
-
Если поле существует в обоих объектах, значение из объекта
from
заменяет значение из объектаto
. Чтобы объединить при слиянии вложенные поля, используйте параметрdeep=true
.
Спецификация функции
merge(to: <объект>, from: <объект>, [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(value: <объект>, table: <строка>, from: <строка>, to <строка>, [separator: <строка>, join_separator: <строка>, case_sensitive: <логическое>]) :: <объект> , <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
объект |
Объект, в котором нужно переименовать поля. |
да |
|
|
строка |
Таблица обогащения. |
да |
|
|
строка |
Колонка с текущими именами. Строка должна быть представлена литералом, без использования переменных. |
да |
|
|
строка |
Колонка с новыми именами. Строка должна быть представлена литералом, без использования переменных. |
да |
|
|
строка |
Строка, разделяющая части сложных ключей. Строка должна быть представлена литералом, без использования переменных. |
нет |
|
|
строка |
Строка, соединяющая части сложных ключей после переименования. Если параметр не указан, то используется значение Строка должна быть представлена литералом, без использования переменных. |
нет |
|
|
логическое значение |
Указывает, будет ли поиск ключей в таблице обогащения регистрозависимым. Значение должно быть представлено литералом ( |
|
нет |
Ошибки
Функция 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)
[ { "events": { "message": "hello" }, "hostname": "localhost" }, { "events": { "message": "world" }, "hostname": "localhost" } ]
Раскроить вложенное поле
. = unnest!(.event.messages)
Функции действий с отдельными элементами
append
Добавляет каждый элемент из массива items
в конец массива value
.
Спецификация функции
append(value: <массив>, items: <массив>) :: <массив>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
массив |
Исходный массив |
да |
|
|
массив |
Элементы для добавления |
да |
Примеры
Соединение массивов
append([1, 2], [3, 4])
[ 1, 2, 3, 4 ]
del
Удаляет из цели поле, указанное статическим path
.
Для удаления динамического пути см. функцию remove
.
Спецификация функции
del(path: <путь>, [compact: <логическое значение>]) :: <любой тип>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
путь |
Путь к удаляемому полю. |
да |
|
|
логическое значение |
Если |
|
нет |
Примечания
У этой функции есть особое поведение, о котором стоит знать:
-
Функция
del
модифицирует текущее событие и возвращает значение удаленного поля.
Примеры
Удаление поля
del(.field1)
Переименование поля
.new_field = del(.old_field)
exists
Проверяет, существует ли путь в цели.
Эта функция различает отсутствующий путь и путь со значением null
. Обычное выражение пути, такое как .foo
, не может различить эти случаи, так как он всегда возвращает значение null
, если путь не существует.
Спецификация функции
exists(path: <путь>) :: <логическое значение>
Примеры
Проверка существования поля
exists(.field)
true
Проверка существования элемента массива
exists(.array[2])
true
get
Динамически получает значение по указанному пути.
Когда вы знаете путь, который вы хотите найти, вы должны использовать статические пути, такие как .foo.bar[1]
, чтобы получить значение этого пути. Однако, когда вы не знаете заранее имена путей, вы можете использовать динамическую функцию get
, чтобы получить значение по запросу.
Спецификация функции
get(value: <объект | массив>, path: <массив>) :: <любой тип>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
объект массив |
Объект или массив для запроса. |
да |
|
|
массив |
Массив из сегментов пути для поиска значения. |
да |
Ошибки
Функция get
может возвращать ошибки, для которых требуется обработка:
-
Сегмент пути должен быть либо "строкой", либо "целым числом".
Примеры
Поле верхнего уровня с одним сегментом
get!(value: { "foo": "bar" }, path: ["foo"])
bar
Вложенное поле с несколькими сегментами
get!(value: { "foo": { "bar": "baz" } }, path: ["foo", "bar"])
baz
Индексирование массива
get!(value: ["foo", "bar", "baz"], path: [-2])
bar
push
Добавляет item
в конец массива value
.
Спецификация функции
push(value: <массив>, item: <любой тип>) :: <массив>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
массив |
Целевой массив. |
да |
|
|
любое |
Элемент для добавления. |
да |
Примеры
Добавление элемента в массив
push([1, 2], 3)
[ 1, 2, 3 ]
Добавление массива в массив
push([1, 2], [3, 4])
[ 1, 2, [ 3, 4 ] ]
remove
Динамически удаляет значение по указанному пути.
Когда вы знаете путь, который хотите удалить, используйте функцию del
и статические пути, такие как del(.foo.bar[1])
, чтобы удалить значение по этому пути. Функция del
возвращает удаленное значение и является более производительной, чем эта функция. Однако, когда вы не знаете заранее имена путей, вы можете использовать эту динамическую функцию для удаления значения по указанному пути.
Спецификация функции
remove(value: <объект | массив>, path: <массив>, [compact: <логическое значение>]) :: <объект | массив>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
объект массив |
Объект или массив, из которого требуется удалить данные. |
да |
|
|
массив |
Массив сегментов пути для удаления значения. |
да |
|
|
логическое значение |
Определяет, следует ли после удаления удалять пустые объекты или массивы. |
|
нет |
Ошибки
Функция remove
может возвращать ошибки, для которых требуется обработка:
-
сегмент пути должен быть либо "строкой", либо "целым числом"
Примеры
Удаление значения односегментного поля верхнего уровня
remove!(value: { "foo": "bar" }, path: ["foo"])
{}
Удаление значения многосегментного вложенного поля
remove!(value: { "foo": { "bar": "baz" } }, path: ["foo", "bar"])
{ "foo": {} }
Индексирование массива
remove!(value: ["foo", "bar", "baz"], path: [-2])
[ "foo", "baz" ]
Удаление с уплотнением
remove!(value: { "foo": { "bar": [42], "baz": true } }, path: ["foo", "bar", 0], compact: true)
{ "foo": { "baz": true } }
set
Динамически вставляет данные в указанный путь объекта или массива.
Когда вы знаете путь, которому хотите присвоить значение, следует использовать статические пути, такие как .foo.bar[1] = true
, для улучшения производительности и читаемости. Однако, когда вы не знаете заранее имена путей, вы можете использовать эту динамическую функцию вставки для вставки данных в объект или массив.
Спецификация функции
set(value: <объект | массив>, path: <массив>, data: <любой тип>) :: <объект | массив>, <ошибка>
Аргумент | Тип | Описание | По умолчанию | Обязателен |
---|---|---|---|---|
|
объект массив |
Объект или массив для вставки данных. |
да |
|
|
массив |
Массив сегментов пути для вставки значения. |
да |
|
|
любое |
Вставляемые данные. |
да |
Ошибки
Функция set
может возвращать ошибки, для которых требуется обработка:
-
сегмент пути должен быть либо "строкой", либо "целым числом"
Примеры
Вставка значения в односегментное поле верхнего уровня
set!(value: { "foo": "bar" }, path: ["foo"], data: "baz")
{ "foo": "baz" }
Вставка значения в многосегментное вложенное поле
set!(value: { "foo": { "bar": "baz" } }, path: ["foo", "bar"], data: "qux")
{ "foo": { "bar": "qux" } }
Массив
set!(value: ["foo", "bar", "baz"], path: [-2], data: 42)
[ "foo", 42, "baz" ]