分享方式:


ARM 範本的 Lambda 函式

本文描述在 ARM 範本中使用的 Lambda 函式。 Lambda 函式基本上是可以當作引數傳遞的程式碼區塊。 其接受多個參數,但僅限於單行程式碼。 在 Bicep 中,Lambda 運算式的格式如下:

lambda(<lambda variable>, [<lambda variable>, ...], <expression>)

提示

我們建議使用 Bicep,因為其提供的功能與 ARM 範本相同,而且語法更易於使用。 若要深入了解,請參閱部署函式。

限制

ARM 範本 Lambda 函式具有下列限制:

  • Lambda 運算式只能在下列函式中直接指定為函式自變數: filter()groupBy()、、 map()mapValues()reduce()sort()toObject()
  • 目前不支援在資源或模組陣列存取內使用 Lambda 變數 (Lambda 函式中使用的暫存變數)。
  • 目前不支援在 listKeys 函式內使用 Lambda 變數。
  • 目前不支援在 reference 函式內使用 Lambda 變數。

篩選器

filter(inputArray, lambda function)

使用自訂篩選函式篩選陣列。

在 Bicep 中,使用 filter (部分機器翻譯) 函式。

參數

參數 必要 類型​ 描述
inputArray Yes 陣列 要篩選的陣列。
Lambda 函式 Yes expression 套用至每個輸入陣列元素的 Lambda 函式。 如果為 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”:[“Other dogs”]}]

oldDogs 會列出五或更舊的狗: dogNameIndex 會識別索引編號小於 2 且名稱開頭為字母 “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 函式。

參數

參數 必要 類型​ 描述
inputArray Yes 陣列 用於分組的陣列。
Lambda 運算式 Yes expression Lambda 運算式會套用至每個輸入陣列元素,並使用群組條件來分組元素。

傳回值

物件。

範例

下列範例示範如何使用 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 中,使用 map (部分機器翻譯) 函式。

參數

參數 必要 類型​ 描述
inputArray Yes 陣列 要對應的陣列。
Lambda 函式 Yes expression 套用至每個輸入陣列元素以產生輸出陣列的 Lambda 函式。

傳回值

陣列。

範例

下列範例示範如何使用 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","Kira"]
sayHi 陣列 ["Hello Evie!","Hello Casper!","Hello Indy!","Hello Kira!"]
mapArray 陣列 [{"i":0,"dog":"Evie","greeting":"Ahoy, Evie!"},{"i":1,"dog":"Casper","greeting":"Ahoy, Casper!"},{"i":2,"dog":"Indy","greeting":"Ahoy, Indy!"},{"i":3,"dog":"Kira","greeting":"Ahoy, Kira!"}]
mapArrayIndex 陣列 [{“index”:0,“val”:“Evie”},{“index”:1,“val”:“Casper”},{“index”:2,“val”:“Indy”},{“index”:3,“val”:“Kira”}]

dogNames 會顯示物件陣列中的狗名稱; sayHi 串連 「Hello」 和每個狗名稱; mapArraymapArrayIndex 會建立另一個兩個物件陣列。

mapValues

mapValues(inputObject, lambda expression)

使用 Lambda 運算式對應值,從輸入物件建立物件。

在 Bicep 中,使用 mapValues 函 式。

參數

參數 必要 類型​ 描述
inputObject Yes object 要對應的物件。
Lambda 運算式 Yes expression 用來對應值的 Lambda 表達式。

傳回值

物件。

範例

下列範例示範如何使用 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)

使用自訂 reduce 函式來縮減陣列。

在 Bicep 中,使用 reduce (部分機器翻譯) 函式。

參數

參數 必要 類型​ 描述
inputArray Yes 陣列 要縮減的陣列。
initialValue Yes 任意 初始值。
Lambda 函式 Yes expression 用來彙總目前值和下一個值的 Lambda 函式。

傳回值

任何。

範例

下列範例顯示如何使用 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 (埃維) 和 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 object {"foo":123,"bar":456,"baz":789}

union 函式會從參數傳回具有所有元素的單一物件。 函式呼叫會將物件的索引鍵值組聯集化為新物件。

sort

sort(inputArray, lambda function)

使用自訂 sort 函式排序陣列。

在 Bicep 中,使用 sort (部分機器翻譯) 函式。

參數

參數 必要 類型​ 描述
inputArray Yes 陣列 要排序的陣列。
Lambda 函式 Yes expression 用來比較兩個陣列元素以進行排序的 Lambda 函式。 如果為 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":["Other dogs"]},{"name":"Evie","age":5,"interests":["Ball","Frisbee"]},{"name":"Kira","age":8,"interests":["Rubs"]}]

toObject

toObject(inputArray, lambda function, [lambda function])

使用自訂索引鍵函式和選用自訂函式,將陣列轉換成物件。 如需了解如何將物件轉換為陣列,請參閱 items (部分機器翻譯)。

在 Bicep 中,使用 toObject (部分機器翻譯) 函式。

參數

參數 必要 類型​ 描述
inputArray Yes 陣列 用於建立物件的陣列。
Lambda 函式 Yes expression 用來提供索引鍵述詞的 Lambda 函式。
Lambda 函式 No expression 用來提供值述詞的 Lambda 函式。

傳回值

物件。

範例

下列範例示範如何使用 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,"interests":["Other dogs"]},"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":["Other dogs"]},"Indy":{"age":2,"interests":["Butter"]},"Kira":{"age":8,"interests":["Rubs"]}}

下一步