Лямбда-функции для шаблонов ARM
В этой статье описываются лямбда-функции, используемые в шаблонах ARM. Лямбда-функции по сути являются блоками кода, которые можно передать в качестве аргумента. Они могут принимать несколько параметров, но ограничены одной строкой кода. В Bicep лямбда-выражение имеет следующий формат:
lambda(<lambda variable>, [<lambda variable>, ...], <expression>)
Совет
Мы рекомендуем использовать Bicep, так как он предоставляет те же возможности, что и шаблоны ARM, и имеет более простой синтаксис. Дополнительные сведения см. в описании функций развертывания.
Ограничения
Лямбда-функция шаблона ARM имеет следующие ограничения:
- Лямбда-выражение можно указать только в качестве аргументов функции в следующих функциях:
filter()
,groupBy()
,map()
,mapValues()
,reduce()
sort()
иtoObject()
. - Использование лямбда-переменных (временные переменные, используемые в лямбда-функциях) в доступе к ресурсу или массиву модулей в настоящее время не поддерживается.
- Использование лямбда-переменных внутри
listKeys
функции в настоящее время не поддерживается. - Использование лямбда-переменных внутри ссылочной функции в настоящее время не поддерживается.
Фильтр
filter(inputArray, lambda function)
Фильтрует массив с помощью пользовательской функции фильтрации.
В Bicep используйте функцию фильтра .
Параметры
Параметр | Обязательное поле | Type | Описание |
---|---|---|---|
inputArray | Да | array | Массив, который нужно отфильтровать. |
лямбда-функция | Да | выражение | Лямбда-функция, применяемая к каждому элементу входного массива. Если значение false, элемент фильтруется из выходного массива. |
Возвращаемое значение
Массив объектов .
Примеры
В следующих примерах показано, как использовать функцию filter
.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"dogs": [
{
"name": "Evie",
"age": 5,
"interests": [
"Ball",
"Frisbee"
]
},
{
"name": "Casper",
"age": 3,
"interests": [
"Other dogs"
]
},
{
"name": "Indy",
"age": 2,
"interests": [
"Butter"
]
},
{
"name": "Kira",
"age": 8,
"interests": [
"Rubs"
]
}
]
},
"resources": [],
"outputs": {
"oldDogs": {
"type": "array",
"value": "[filter(variables('dogs'), lambda('dog', greaterOrEquals(lambdaVariables('dog').age, 5)))]"
},
"dogNameIndex": {
"type": "array",
"value": "[filter(variables('dogs'), lambda('val', 'i', and(less(lambdaVariables('i'), 2), equals(substring(lambdaVariables('val').name, 0, 1), 'C'))))]"
}
}
}
Выходные данные из предыдущего примера:
Имя. | Тип | значение |
---|---|---|
oldDogs | Массив | [{"name":"Evie","age":5,"interests":["Ball","Frisbee"]},{"name":"Kira","age":8,"interests":["Rubs"]}] |
dogNameIndex | Массив | [{"name":"Casper","age":3,"interests":["Другие собаки"]}] |
oldDogs перечисляет собак, которые являются пятью или более старыми; dogNameIndex определяет собак, индекс которых меньше двух и имя которого начинается с буквы "C".
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"copy": [
{
"name": "itemForLoop",
"count": "[length(range(0, 10))]",
"input": "[range(0, 10)[copyIndex('itemForLoop')]]"
}
]
},
"resources": [],
"outputs": {
"filteredLoop": {
"type": "array",
"value": "[filter(variables('itemForLoop'), lambda('i', greater(lambdaVariables('i'), 5)))]"
},
"isEven": {
"type": "array",
"value": "[filter(range(0, 10), lambda('i', equals(0, mod(lambdaVariables('i'), 2))))]"
}
}
}
Выходные данные из предыдущего примера:
Имя. | Тип | значение |
---|---|---|
filteredLoop | Массив | [6, 7, 8, 9] |
isEven | Массив | [0, 2, 4, 6, 8] |
filterdLoop показывает числа в массиве, превышающем 5; и isEven отображает четные числа в массиве.
Groupby
groupBy(inputArray, lambda expression)
Создает объект со значениями массива из массива с помощью условия группировки.
В Bicep используйте функцию groupBy .
Параметры
Параметр | Обязательное поле | Type | Описание |
---|---|---|---|
inputArray | Да | array | Массив для группировки. |
лямбда-выражение | Да | выражение | Лямбда-выражение применяется к каждому элементу входного массива и группировать элементы с помощью условия группировки. |
Возвращаемое значение
Объект.
Примеры
Ниже представлен пример использования функции groupBy
.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"inputArray": [
"foo",
"bar",
"baz"
]
},
"resources": [],
"outputs": {
"outObject": {
"type": "object",
"value": "[groupBy(variables('inputArray'), lambda('x', substring(lambdaVariables('x'), 0, 1)))]"
}
}
}
В выходных данных из предыдущего примера показаны собаки, которые являются пятью или более старыми:
Имя. | Тип | значение |
---|---|---|
outObject | Object | {"f":["foo"],"b":["bar","baz"]} |
outObject показывает объект, который группирует элементы массива по их первым буквам.
map
map(inputArray, lambda function)
Применяет настраиваемую функцию сопоставления к каждому элементу массива.
В Bicep используйте функцию карты .
Параметры
Параметр | Обязательное поле | Type | Описание |
---|---|---|---|
inputArray | Да | array | Массив для сопоставления. |
лямбда-функция | Да | выражение | Лямбда-функция, применяемая к каждому элементу входного массива, для создания выходного массива. |
Возвращаемое значение
Массив объектов .
Пример
Ниже представлен пример использования функции map
.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"dogs": [
{
"name": "Evie",
"age": 5,
"interests": [
"Ball",
"Frisbee"
]
},
{
"name": "Casper",
"age": 3,
"interests": [
"Other dogs"
]
},
{
"name": "Indy",
"age": 2,
"interests": [
"Butter"
]
},
{
"name": "Kira",
"age": 8,
"interests": [
"Rubs"
]
}
]
},
"resources": [],
"outputs": {
"dogNames": {
"type": "array",
"value": "[map(variables('dogs'), lambda('dog', lambdaVariables('dog').name))]"
},
"sayHi": {
"type": "array",
"value": "[map(variables('dogs'), lambda('dog', format('Hello {0}!', lambdaVariables('dog').name)))]"
},
"mapArray": {
"type": "array",
"value": "[map(range(0, length(variables('dogs'))), lambda('i', createObject('i', lambdaVariables('i'), 'dog', variables('dogs')[lambdaVariables('i')].name, 'greeting', format('Ahoy, {0}!', variables('dogs')[lambdaVariables('i')].name))))]"
},
"mapArrayIndex": {
"type": "array",
"value": "[map(variables('dogs'), lambda('x', 'i', createObject('index', lambdaVariables('i'), 'val', lambdaVariables('x').name)))]"
}
}
}
Выходные данные из предыдущего примера:
Имя. | Тип | значение |
---|---|---|
dogNames | Массив | ["Evie", "Casper", "Indy", "Кира"] |
Sayhi | Массив | ["Hello Evie!", "Hello Casper!", "Hello Indy!", "Hello Kira!"] |
mapArray | Массив | [{"i":0,"dog":"Evie","greeting":"Ahoy, Evie!"},{"i":1,"dog":"Casper","приветствие":"Ahoy, Casper!"},{"i":2,"собака":"Indy","приветствие":"Ahoy, Indy!"},{"i":"собака":"Кира","приветствие":"Ahoy, Кира!"}] |
mapArrayIndex | Массив | [{"index":0,"val":"Evie"},{"index":1,"val":"Casper"},{"index":2,"val":"Indy"},{"index":3,"val":"Kira"}] |
dogNames показывает имена собак из массива объектов; sayHi сцепление "Hello" и каждое из названий собак; mapArray и mapArrayIndex создают еще два массива объектов.
mapValues
mapValues(inputObject, lambda expression)
Создает объект из входного объекта, используя лямбда-выражение для сопоставления значений.
В Bicep используйте функцию mapValues .
Параметры
Параметр | Обязательное поле | Type | Описание |
---|---|---|---|
inputObject | Да | объект | Объект для сопоставления. |
лямбда-выражение | Да | выражение | Лямбда-выражение, используемое для сопоставления значений. |
Возвращаемое значение
Объект.
Пример
Ниже представлен пример использования функции mapValues
.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"inputObject": {
"foo": "foo",
"bar": "bar"
}
},
"resources": [],
"outputs": {
"mapObject": {
"type": "object",
"value": "[mapValues(variables('inputObject'), lambda('val', toUpper(lambdaVariables('val'))))]"
}
}
}
Выходные данные из предыдущего примера:
Имя. | Тип | значение |
---|---|---|
mapObject | Object | {foo: 'FOO', bar: 'BAR'} |
mapObject создает другой объект со значениями в верхнем регистре.
reduce
reduce(inputArray, initialValue, lambda function)
Уменьшает массив с помощью пользовательской функции уменьшения.
В Bicep используйте функцию уменьшения.
Параметры
Параметр | Обязательное поле | Type | Описание |
---|---|---|---|
inputArray | Да | array | Массив для уменьшения. |
initialValue | Да | любое | Начальное значение. |
лямбда-функция | Да | выражение | Лямбда-функция, используемая для агрегирования текущего значения и следующего значения. |
Возвращаемое значение
Любой.
Пример
В следующих примерах показано, как использовать функцию reduce
.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"dogs": [
{
"name": "Evie",
"age": 5,
"interests": [
"Ball",
"Frisbee"
]
},
{
"name": "Casper",
"age": 3,
"interests": [
"Other dogs"
]
},
{
"name": "Indy",
"age": 2,
"interests": [
"Butter"
]
},
{
"name": "Kira",
"age": 8,
"interests": [
"Rubs"
]
}
],
"ages": "[map(variables('dogs'), lambda('dog', lambdaVariables('dog').age))]"
},
"resources": [],
"outputs": {
"totalAge": {
"type": "int",
"value": "[reduce(variables('ages'), 0, lambda('cur', 'next', add(lambdaVariables('cur'), lambdaVariables('next'))))]"
},
"totalAgeAdd1": {
"type": "int",
"value": "[reduce(variables('ages'), 1, lambda('cur', 'next', add(lambdaVariables('cur'), lambdaVariables('next'))))]"
},
"oddAge": {
"type": "int",
"value": "[reduce(variables('ages'), 0, lambda('cur', 'next', 'i', if(equals(mod(lambdaVariables('i'), 2), 0), add(lambdaVariables('cur'), lambdaVariables('next')), lambdaVariables('cur'))))]"
}
}
}
Выходные данные из предыдущего примера:
Имя. | Тип | значение |
---|---|---|
TotalAge | INT | 18 |
totalAgeAdd1 | INT | 19 |
oddAge | INT | 7 |
totalAge суммирует возраст собак; totalAgeAdd1 имеет начальное значение 1, и добавляет все возрасты собаки к начальным значениям. oddAge суммирует возраст собак, расположенных на даже индексах, в частности 5 (Evie) и 2 (Indy).
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [],
"outputs": {
"reduceObjectUnion": {
"type": "object",
"value": "[reduce(createArray(createObject('foo', 123), createObject('bar', 456), createObject('baz', 789)), createObject(), lambda('cur', 'next', union(lambdaVariables('cur'), lambdaVariables('next'))))]"
}
}
}
Выходные данные из предыдущего примера:
Имя. | Тип | значение |
---|---|---|
reduceObjectUnion | объект | {"foo":123,"bar":456,"baz":789} |
Функция объединения возвращает один объект со всеми элементами из параметров. Вызов функции связывает пары ключевых значений объектов в новый объект.
sort
sort(inputArray, lambda function)
Сортирует массив с помощью пользовательской функции сортировки.
В Bicep используйте функцию сортировки.
Параметры
Параметр | Обязательное поле | Type | Описание |
---|---|---|---|
inputArray | Да | array | Массив для сортировки. |
лямбда-функция | Да | выражение | Лямбда-функция, используемая для сравнения двух элементов массива для упорядочивания. Если значение true, второй элемент будет упорядочен после первого в выходном массиве. |
Возвращаемое значение
Массив объектов .
Пример
Ниже представлен пример использования функции sort
.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"dogs": [
{
"name": "Evie",
"age": 5,
"interests": [
"Ball",
"Frisbee"
]
},
{
"name": "Casper",
"age": 3,
"interests": [
"Other dogs"
]
},
{
"name": "Indy",
"age": 2,
"interests": [
"Butter"
]
},
{
"name": "Kira",
"age": 8,
"interests": [
"Rubs"
]
}
]
},
"resources": [],
"outputs": {
"dogsByAge": {
"type": "array",
"value": "[sort(variables('dogs'), lambda('a', 'b', less(lambdaVariables('a').age, lambdaVariables('b').age)))]"
}
}
}
Выходные данные из предыдущего примера сортируют объекты собаки от самых молодых до самых старых:
Имя. | Тип | значение |
---|---|---|
dogsByAge | Массив | [{"name":"Indy","age":2,"interests":["Butter"]},{"name":"Casper","age":3,"interests":["Другие собаки"]},{"name" ":"Evie","age":5,"interests":["Ball","Frisbee"]},{"name":"Kira","age":8,"interests":["Rubs"]}] |
toObject
toObject(inputArray, lambda function, [lambda function])
Преобразует массив в объект с пользовательской ключевой функцией и необязательной функцией пользовательского значения. См . элементы о преобразовании объекта в массив.
В Bicep используйте функцию toObject .
Параметры
Параметр | Обязательное поле | Type | Описание |
---|---|---|---|
inputArray | Да | array | Массив, используемый для создания объекта. |
лямбда-функция | Да | выражение | Лямбда-функция, используемая для предоставления предиката ключа. |
лямбда-функция | No | выражение | Лямбда-функция, используемая для предоставления предиката значения. |
Возвращаемое значение
Объект.
Пример
В следующем примере показано, как использовать функцию toObject
с двумя обязательными параметрами:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"dogs": [
{
"name": "Evie",
"age": 5,
"interests": [
"Ball",
"Frisbee"
]
},
{
"name": "Casper",
"age": 3,
"interests": [
"Other dogs"
]
},
{
"name": "Indy",
"age": 2,
"interests": [
"Butter"
]
},
{
"name": "Kira",
"age": 8,
"interests": [
"Rubs"
]
}
]
},
"resources": [],
"outputs": {
"dogsObject": {
"type": "object",
"value": "[toObject(variables('dogs'), lambda('entry', lambdaVariables('entry').name))]"
}
}
}
В предыдущем примере создается объект на основе массива.
Имя. | Тип | значение |
---|---|---|
dogsObject | Object | {"Evie":{"name":"Evie","age":5,"interests":["Ball","Frisbee"]},"Casper":{"name":"Casper","age":3,"интересы":["Другие собаки"].},"Indy":{"name":"Indy","age":2,"interests":["Butter"]},"Kira":"name":"Kira","age":8,"interests":["Rubs"]}} |
toObject
Следующая функция с третьим параметром предоставляет одинаковые выходные данные.
"outputs": {
"dogsObject": {
"type": "object",
"value": "[toObject(variables('dogs'), lambda('entry', lambdaVariables('entry').name), lambda('entry', lambdaVariables('entry')))]"
}
}
В следующем примере показано, как использовать функцию toObject
с тремя параметрами.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"variables": {
"dogs": [
{
"name": "Evie",
"properties": {
"age": 5,
"interests": [
"Ball",
"Frisbee"
]
}
},
{
"name": "Casper",
"properties": {
"age": 3,
"interests": [
"Other dogs"
]
}
},
{
"name": "Indy",
"properties": {
"age": 2,
"interests": [
"Butter"
]
}
},
{
"name": "Kira",
"properties": {
"age": 8,
"interests": [
"Rubs"
]
}
}
]
},
"resources": [],
"outputs": {
"dogsObject": {
"type": "object",
"value": "[toObject(variables('dogs'), lambda('entry', lambdaVariables('entry').name), lambda('entry', lambdaVariables('entry').properties))]"
}
}
}
В предыдущем примере создается объект на основе массива.
Имя. | Тип | значение |
---|---|---|
dogsObject | Object | {"Evie":{"age":5,"interests":["Ball","Frisbee"]},"Casper":{"age":3,"interests":["Другие собаки"},"Indy":{"age":2,"interests":["Butter"]},"Kira":{"age"::8,"interests":["Rubs"}} |
Следующие шаги
- Дополнительные функции шаблона см. в разделе "Функции шаблона" — массивы для получения дополнительных функций шаблона массива.