Перейти к основному содержимому
Версия: 2.0 (WIP)

Функции высшего порядка

$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"
}
]