وظائف Lambda لقوالب ARM

توضح هذه المقالة وظائف lambda لاستخدامها في قوالب ARM. دالات Lambda هي في الأساس كتل من التعليمات البرمجية التي يمكن تمريرها كوسيطة. يمكن أن تأخذ معلمات متعددة، ولكن تقتصر على سطر واحد من التعليمات البرمجية. في Bicep، تعبير lambda بهذا التنسيق:

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

تلميح

نوصي باستخدام Bicep لأنها تقدم نفس الإمكانات التي توفرها نماذج ARM ولأن البنية أسهل في الاستخدام. لمعرفة المزيد، راجع دوال deployment.

القيود

تحتوي وظيفة قالب ARM lambda على هذه القيود:

  • يمكن تحديد تعبير Lambda مباشرة فقط كوسيطات دالة في هذه الدالات: filter()وgroupBy()sort()map()mapValues()reduce().toObject()
  • استخدام متغيرات lambda (المتغيرات المؤقتة المستخدمة في وظائف lambda) داخل الوصول إلى صفيف الموارد أو الوحدة النمطية غير مدعوم حاليا.
  • استخدام متغيرات lambda داخل الدالة listKeys غير مدعوم حاليا.
  • استخدام متغيرات lambda داخل الدالة المرجعية غير مدعوم حاليا.

filter

filter(inputArray, lambda function)

تصفية صفيف مع دالة تصفية مخصصة.

في Bicep، استخدم دالة التصفية.

المعلمات

المعلمة‬ المطلوب نوع ‏‏الوصف
inputArray ‏‏نعم‬ صفيف الصفيف المراد تصفيته.
دالة lambda ‏‏نعم‬ تعبير يتم تطبيق الدالة lambda على كل عنصر صفيف إدخال. إذا كان خطأ، تتم تصفية العنصر من صفيف الإخراج.

قيمة الإرجاع

صفيف.

الأمثلة

توضح الأمثلة التالية كيفية استخدام الدالة 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'))))]"
    }
  }
}

المخرجات من المثال السابق:

Name نوع القيمة‬
oldDogs صفيف [{"name":"Evie","age":5,"interests":["Ball","Frisbee"]},{"name":"Kira","age":8,"interests":["Rubs"]}]
dogNameIndex صفيف [{"name":"Casper","age":3,"interests":["Other dogs"]}]

يسرد 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))))]"
    }
  }
}

الإخراج من المثال السابق:

Name نوع القيمة‬
تم تصفيةLoop صفيف [6, 7, 8, 9]
isEven صفيف [0, 2, 4, 6, 8]

يعرض filterdLoop الأرقام الموجودة في صفيف أكبر من 5؛ ويعرض isEven الأرقام الزوجية في الصفيف.

groupBy

groupBy(inputArray, lambda expression)

إنشاء كائن بقيم صفيف من صفيف، باستخدام شرط تجميع.

في Bicep، استخدم الدالة groupBy .

المعلمات

المعلمة‬ المطلوب نوع ‏‏الوصف
inputArray ‏‏نعم‬ صفيف صفيف التجميع.
تعبير lambda ‏‏نعم‬ تعبير يتم تطبيق تعبير 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)))]"
    }
  }
}

يظهر الإخراج من المثال السابق الكلاب التي هي خمسة أو أقدم:

Name نوع القيمة‬
outObject ‏‏الكائن {"f":["foo"],"b":["bar","baz"]}

يظهر outObject كائنا يجمع عناصر الصفيف بأحرفها الأولى.

map

map(inputArray, lambda function)

تطبيق دالة تعيين مخصصة على كل عنصر من عناصر الصفيف.

في Bicep، استخدم دالة الخريطة .

المعلمات

المعلمة‬ المطلوب نوع ‏‏الوصف
inputArray ‏‏نعم‬ صفيف الصفيف المراد تعيينه.
دالة lambda ‏‏نعم‬ تعبير تم تطبيق دالة 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)))]"
    }
  }
}

المخرجات من المثال السابق هي:

Name نوع القيمة‬
أسماء الكلاب صفيف ["إيفي"، "كاسبر"، "إندي"، "كيرا"]
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"}]

تظهر أسماء الكلاب أسماء الكلاب من صفيف الكائنات؛ sayHi يسلسل "مرحبا" وكل اسم من أسماء الكلاب؛ ينشئ mapArray وmapArrayIndex صفيفين آخرين من الكائنات.

قيم الخريطة

mapValues(inputObject, lambda expression)

إنشاء كائن من كائن إدخال، باستخدام تعبير lambda لتعيين القيم.

في Bicep، استخدم الدالة mapValues .

المعلمات

المعلمة‬ المطلوب نوع ‏‏الوصف
inputObject ‏‏نعم‬ كائن الكائن المراد تعيينه.
تعبير lambda ‏‏نعم‬ تعبير تعبير 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'))))]"
    }
  }
}

المخرجات من المثال السابق هي:

Name نوع القيمة‬
mapObject ‏‏الكائن {foo: 'FOO'، الشريط: 'BAR'}

ينشئ mapObject كائنا آخر بالقيم في الأحرف العلوية.

reduce

reduce(inputArray, initialValue, lambda function)

تقليل صفيف مع دالة تقليل مخصصة.

في Bicep، استخدم دالة التقليل .

المعلمات

المعلمة‬ المطلوب نوع ‏‏الوصف
inputArray ‏‏نعم‬ صفيف الصفيف المراد تقليله.
القيمة الأولية ‏‏نعم‬ أي القيمة الأولية.
دالة lambda ‏‏نعم‬ تعبير الدالة 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'))))]"
    }
  }
}

المخرجات من المثال السابق هي:

Name نوع القيمة‬
totalAge العدد الصحيح 18
totalAgeAdd1 العدد الصحيح 19
فردية العدد الصحيح 7

مجموع إجمالي العمر من الكلاب؛ 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'))))]"
    }
  }
}

المخرجات من المثال السابق هي:

Name نوع القيمة‬
reduceObjectUnion كائن {"foo":123,"bar":456,"baz":789}

ترجع الدالة union كائنا واحدا مع كافة العناصر من المعلمات. يوحد استدعاء الدالة أزواج القيمة الرئيسية للكائنات في كائن جديد.

sort

sort(inputArray, lambda function)

فرز صفيف باستخدام دالة فرز مخصصة.

في Bicep، استخدم دالة الفرز.

المعلمات

المعلمة‬ المطلوب نوع ‏‏الوصف
inputArray ‏‏نعم‬ صفيف الصفيف المراد فرزه.
دالة lambda ‏‏نعم‬ تعبير الدالة lambda المستخدمة لمقارنة عنصري صفيف للطلب. إذا كان صحيحا، فسيتم ترتيب العنصر الثاني بعد العنصر الأول في صفيف الإخراج.

قيمة الإرجاع

صفيف.

مثال

يوضح المثال التالي كيفية استخدام الوظيفة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)))]"
    }
  }
}

يفرز الإخراج من المثال السابق كائنات الكلب من الأصغر إلى الأقدم:

Name نوع القيمة‬
كلاب هاوية صفيف [{"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])

تحويل صفيف إلى كائن باستخدام دالة مفتاح مخصصة ودالة قيمة مخصصة اختيارية. عرض عناصر حول تحويل كائن إلى صفيف.

في Bicep، استخدم الدالة toObject .

المعلمات

المعلمة‬ المطلوب نوع ‏‏الوصف
inputArray ‏‏نعم‬ صفيف الصفيف المستخدم لإنشاء كائن.
دالة lambda ‏‏نعم‬ تعبير الدالة lambda المستخدمة لتوفير دالة التقييم الرئيسية.
دالة lambda لا تعبير الدالة 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))]"
    }
  }
}

ينشئ المثال السابق كائنا استنادا إلى صفيف.

Name نوع القيمة‬
dogsObject ‏‏الكائن {"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))]"
    }
  }
}

ينشئ المثال السابق كائنا استنادا إلى صفيف.

Name نوع القيمة‬
dogsObject ‏‏الكائن {"Evie":{"age":5,"interests":["Ball","Frisbee"]},"Casper":{"age":3,"interests":["Other dogs"]},"Indy":{"age":2,"interests":["Butter"]},"Kira":{"age":8,"interests":["Rubs"]}}

الخطوات التالية