前回に続きPowerAutomateで配列を操作するときに必要になったテクニックの紹介です。
Problem
文字列の配列について、その値をキーに、キー(添字)を値とするマップ(辞書)を作りたい。
例によってPowerAutomateにはこのようなオペレーションをシンプルに行うための関数は存在しない。
「Apply to each」アクションと配列変数を使う方法はフロー内で場所も時間もとってしまうので避けたい。
イメージ:
変換前 Array<String>
変換後 Map<String,Integer>
Solution
range()
関数とjson()
関数を活用します。
まずは例示のための配列を作成します:
[
"foo",
"bar",
"baz"
]
次にrange()
関数が生成する整数列を選択アクションで処理します。整数列は変換対象の配列と同じ長さを持ちます。
この整数を使って変換対象の配列から要素を取り出して、JSONオブジェクトのプロパティ・リテラル('"key": "value"'
)を作成します:
- From:
range(0, length(outputs('Compose_arrayX')))
- Map:
concat(outputs('Compose_arrayX')[item()], ':', item())
こうして作成したリテラルを','
で繋げ、'{'
と'}'
で囲い、json()
関数でJSONリテラルとしてパースします:
- Inputs:
json(concat('{', join(body('Select_property_literal'), ','), '}'))
以上です。
実行すると、このように変換ができていることがわかります:
{
"foo": 0,
"bar": 1,
"baz": 2
}
応用:オブジェクトの配列をオブジェクトのマップに変換する
これを応用すると、オブジェクトの配列を(オブジェクトに含まれる任意のプロパティ値をキーとする)オブジェクトのマップに変換するフローも作成できます。
まずは例示のための配列を作成します:
[
{
"key": 1,
"value1": "arrayA_item1_value1",
"value2": "arrayA_item1_value2"
},
{
"key": 2,
"value1": "arrayA_item2_value1",
"value2": "arrayA_item2_value2"
},
{
"key": 3,
"value1": "arrayA_item3_value1",
"value2": "arrayA_item3_value2"
}
]
次にJSONオブジェクトのプロパティ・リテラルを作るところですが、ここではrange()
関数を使っても使わなくてもOKです。今回は使わない例:
- From:
outputs('Compose_arrayX')
- Map:
concat(item()['key'],':',removeProperty(item(), 'key'))
こうして作成したリテラルを','
で繋げ、'{'
と'}'
で囲い、json()
関数でJSONリテラルとしてパースします。ここは先ほどと一切替わりありません:
- Inputs:
json(concat('{', join(body('Select_property_literal'), ','), '}'))
実行した結果は次の通り:
{
"1": {
"value1": "arrayA_item1_value1",
"value2": "arrayA_item1_value2"
},
"2": {
"value1": "arrayA_item2_value1",
"value2": "arrayA_item2_value2"
},
"3": {
"value1": "arrayA_item3_value1",
"value2": "arrayA_item3_value2"
}
}