Другие операторы
& (Конкатенация)
Оператор конкатенации строк объединяет строковые значения операндов в одну результирующую строку. Если один или оба операнда не являются строками, сначала они приводятся к строке по правилам функции $string.
Пример
"Hello" & "World" => "HelloWorld"
? : (Условный оператор)
Условный тернарный оператор вычисляет одно из двух альтернативных выражений на основании результата условия-предиката. Оператор имеет вид:
<test_expr> ? <expr_T> : <expr_F>
Сначала вычисляется выражение <test_expr>. Если оно вычисляется в логическое значение true, оператор возвращает результат вычисления <expr_T>. В противном случае он возвращает результат <expr_F>. Если <test_expr> вычисляется в нелогическое значение, оно сначала приводится к логическому по правилам функции $boolean.
Пример
Price < 50 ? "Cheap" : "Expensive"
?: (Значение по умолчанию / Elvis)
Оператор значения по умолчанию (или «Elvis») возвращает левую часть, если её эффективное логическое значение равно true; иначе он возвращает правую часть. Это полезно для подстановки резервных значений, когда выражение может вычислиться в значение с эффективным логическим значением false, например null, false, 0, '' или undefined.
Синтаксис
<expr1> ?: <expr2>
Пример
foo.bar ?: 'default' => 'default' (если foo.bar вычисляется в логическое значение false)
?? (Коалесцирование)
Оператор коалесцирования возвращает левую часть, если она определена (не undefined), иначе возвращает правую часть. Он полезен для подстановки резервного значения, только когда левая часть отсутствует или не представлена (пустая последовательность), но не для других значений с эффективным логическим значением false, таких как 0, false или ''.
Синтаксис
<expr1> ?? <expr2>
Примеры
foo.bar ?? 42 => 42 (если foo.bar не определено)
foo.bar ?? 'default' => 'default' (если foo.bar не определено)
0 ?? 1 => 0
'' ?? 'fallback' => ''
:= (Привязка переменной)
Оператор привязки переменной присваивает значению справа (RHS) имя переменной, заданное слева (LHS). Привязка действует в текущем блоке и во всех вложенных блоках. Если LHS не является символом $, за которым следует допустимое имя переменной, возникает ошибка.
Примеры
$five := 5$square := function($n) { $n * $n }
~> (Цепочка)
Оператор цепочки функций применяется, когда нужно применить к значению несколько вложенных функций, сохраняя выражение читаемым. Значение слева (LHS) вычисляется и передаётся функции справа (RHS) первым аргументом. Если у функции есть другие аргументы, они, как обычно, передаются в скобках. Если RHS не является функцией или выражением, вычисляющимся в функцию, возникает ошибка.
Примеры
$uppercase($substringBefore($substringAfter(Customer.Email, "@"), "."))
$sum(Account.Order.Product.(Price * Quantity))
Можно записать понятнее:
Customer.Email ~> $substringAfter("@") ~> $substringBefore(".") ~> $uppercase()
Account.Order.Product.(Price * Quantity) ~> $sum()
Этот оператор можно использовать и в более абстрактной форме, чтобы определять новые функции как комбинации существующих. В этой форме в LHS первой функции цепочки не передаётся значение.
Например, выражение:
(
$uppertrim := $trim ~> $uppercase;
$uppertrim(" Hello World ")
)
=> "HELLO WORLD"
создаёт новую функцию $uppertrim, которая выполняет $trim, а затем $uppercase.
... ~> | ... | ... | (Преобразование)
Оператор преобразования объекта изменяет копию структуры объекта, используя синтаксис «шаблон/действие» для адресных изменений и сохраняя остальную структуру без изменений.
Синтаксис имеет следующую структуру:
head ~> | location | update [, delete] |
где:
headвычисляется в объект, который нужно скопировать и преобразовать;locationвычисляется в часть или части скопированного объекта, которые нужно обновить. Выражениеlocationвычисляется относительно результатаhead; его результатом должен быть объект или массив объектов;updateвычисляется в объект, объединяемый с объектом, найденным каждойlocation.updateвычисляется относительно результатаlocation; еслиlocationсоответствует нескольким объектам, обновление вычисляется для каждого из них. Результат каждого обновления объединяется с результатомlocation;delete(необязательно) вычисляется в строку или массив строк. Каждая строка — имя пары имя/значение в каждом объекте, найденномlocation, которую следует удалить из результирующего объекта.
Оператор ~> используется для цепочки функций и передаёт значение слева функции справа первым аргументом. Выражение справа должно вычисляться в функцию, поэтому синтаксис |...|...| создаёт функцию с одним аргументом.
Пример
| Account.Order.Product | {'Price': Price * 1.2} |
определяет преобразование, которое вернёт глубокую копию переданного ему объекта, но изменит объект Product, увеличив значение его свойства Price на 20%. Первая часть выражения — расположение пути, задающее все объекты общей структуры для изменения; вторая определяет объект, который будет объединён с объектами, найденными первой частью. Семантика объединения такая же, как у функции $merge().
Этот синтаксис определения преобразования создаёт функцию JSONata: её можно присвоить переменной и использовать многократно либо вызвать встроенно.
Пример
payload ~> |Account.Order.Product|{'Price': Price * 1.2}|
или:
$increasePrice := |Account.Order.Product|{'Price': Price * 1.2}|
Это также позволяет объединить несколько преобразований в цепочку для более сложных изменений.
Как и с $merge(), в объект можно внести несколько изменений: добавить или обновить свойства.
Пример
|Account.Order.Product|{'Price': Price * 1.2, 'Total': Price * Quantity}|
Обратите внимание: Total вычисляется с исходной ценой, а не с изменённой, поскольку JSONata декларативен, а не императивен.
Свойства также можно удалять из объектов. Для этого используется необязательная секция delete, в которой указаны имена удаляемых свойств.
Пример
$ ~> |Account.Order.Product|{'Total': Price * Quantity}, ['Price', 'Quantity']|
Это копирует входные данные, но для каждого Product добавляет Total и удаляет свойства Price и Quantity.