Лямбда-функции для шаблонов 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"}}

Следующие шаги