Функции высшего порядка
$map()
Сигнатура: $map(array, function)
Если входной аргумент — массив из двух или более элементов, возвращает массив результатов применения function к каждому значению array.
$map([1,2,3], function($v) { $v * 2 })
Результат:
[ 2, 4, 6 ]
Если входной массив содержит один элемент, возвращается единственный результат применения function к его значению:
$map([2], function($v) { $v * 2 })
Результат: 4. Для пустого массива функция ничего не возвращает (в JavaScript это undefined).
Передаваемая вторым параметром функция должна иметь сигнатуру function(value [, index [, array]]). Значение элемента передаётся первым параметром, его индекс — вторым, если он указан, а весь входной массив — третьим, если он указан.
Примеры:
$map([1..5], $string)=>["1", "2", "3", "4", "5"]
С пользовательской (лямбда-)функцией:
$map(Email.address, function($v, $i, $a) {
'Item ' & ($i+1) & ' of ' & $count($a) & ': ' & $v
})
Результат:
[
"Item 1 of 4: fred.smith@my-work.com",
"Item 2 of 4: fsmith@my-work.com",
"Item 3 of 4: freddy@my-social.com",
"Item 4 of 4: frederic.smith@very-serious.com"
]
$filter()
Сигнатура: $filter(array, function)
Возвращает массив только с теми значениями array, которые удовлетворяют предикату function (то есть функция возвращает логическое true для значения).
Передаваемая вторым параметром функция имеет сигнатуру function(value [, index [, array]]): ей передаются значение элемента, при необходимости его индекс и весь входной массив.
Следующее выражение возвращает все продукты, цена которых выше средней:
$filter(Account.Order.Product, function($v, $i, $a) {
$v.Price > $average($a.Price)
})
$single()
Сигнатура: $single(array, function)
Возвращает единственное значение array, удовлетворяющее предикату function. Если подходящих значений не ровно одно, генерируется исключение.
Функция имеет сигнатуру function(value [, index [, array]]): ей передаются значение, при необходимости индекс и весь массив.
Следующее выражение возвращает продукт заказа с SKU "0406654608":
$single(Account.Order.Product, function($v, $i, $a) {
$v.SKU = "0406654608"
})
$reduce()
Сигнатура: $reduce(array, function [, init])
Возвращает агрегированное значение, полученное последовательным применением function к каждому значению array вместе с результатом предыдущего применения функции.
function должна принимать не менее двух аргументов и работает как инфиксный оператор между значениями массива. Её сигнатура: myfunc($accumulator, $value[, $index[, $array]]).
(
$product := function($i, $j){$i * $j};
$reduce([1..5], $product)
)
Это перемножает все значения массива [1..5] и возвращает 120.
Если передан необязательный init, он используется как начальное значение процесса агрегации (свёртки). Иначе начальным значением служит первый элемент array.
$sift()
Сигнатура: $sift(object, function)
Возвращает объект, содержащий только пары ключ/значение object, удовлетворяющие предикату function второго параметра.
Если object не указан, используется значение контекста. Если object не является объектом, возникает ошибка.
Функция имеет сигнатуру function(value [, key [, object]]): ей передаются значение свойства, при необходимости ключ (имя свойства) и весь входной объект.
Account.Order.Product.$sift(function($v, $k) {$k ~> /^Product/})
Этот пример отбирает в каждом объекте Product только поля с ключами, начинающимися со строки "Product" (с использованием регулярного выражения). Результат:
[
{
"Product Name": "Bowler Hat",
"ProductID": 858383
},
{
"Product Name": "Trilby hat",
"ProductID": 858236
},
{
"Product Name": "Bowler Hat",
"ProductID": 858383
},
{
"ProductID": 345664,
"Product Name": "Cloak"
}
]