Power Automateでのコレクション処理のまとめ

# 概要
どうやってたっけ？となることがたまにあるので、備忘録

# コネクター
## [選択(Select)](https://docs.microsoft.com/ja-jp/power-automate/data-operations#use-the-select-action)
データの再構築に。MS の以下の例を見れば分かりやすいかと。<br>
<img src="https://docs.microsoft.com/ja-jp/power-automate/media/data-operations/select-card-2.png" />
 
https://docs.microsoft.com/ja-jp/power-automate/data-operations#use-the-select-action

### 実はオブジェクト再構築だけじゃなく、簡単に単純配列化も出来ます。
配列化することで、Key 項目の一意化も楽に。
とはいえ、Automate だけで頑張るのは大変なので Office Scripts に任せた方が楽だったりしますけど・・。

やり方は以下のように、Map 方法を Text Mode にして、単純に配列化したい項目を指定するだけ。

```ribon:配列化の例
item()?['user']
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/9ee6c1e1-6699-4b92-e5bc-c2d811b5eb57.png)

## [フィルター配列(Filter Array)](https://docs.microsoft.com/ja-jp/power-automate/data-operations#use-the-filter-array-action)
普通に配列のフィルターが使えます。

https://docs.microsoft.com/ja-jp/power-automate/data-operations#use-the-filter-array-action

### 複数条件でのフィルター方法
and/or を嚙ませることで、細かい条件指定をすることも可能です。

やり方は、Advanced Mode にして、以下のように条件を複数指定するだけ

```ribon:複数条件の例
@and(equals(items('Apply_to_each'), item()?['user']), equals(item()?['reactionType'], 'like'))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/125ba628-1fa8-932c-b82c-30b1acb8586a.png)


# 関数
## 基本はここ
https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#collection-functions

|コレクション関数||メモ|
|-|-|-|
|[chunk](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#chunk)|文字列またはコレクションを等しい長さのチャンクに分割します。|一定数毎のLoopを行う際の事前分割。<br>[payload is too large の回避例](https://qiita.com/baku2san/items/b0c2af169df3c4cbb851)|
|[contains](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#contains)|コレクションに特定の項目があるかどうかを確認します。|－|
|[empty](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#empty)|コレクションが空かどうかを調べます。|－|
|[first](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#first)|コレクションから最初の項目を返します。|－|
|[intersection](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#intersection)|指定したコレクションすべてに共通する項目 "のみ" を含むコレクションを返します。<br>以下記事を参考に<br>[PowerAutomate: 配列の積集合を取得する（ホワイトリストにある要素だけを抜き出す)](https://qiita.com/baku2san/items/5c229aa03ba2d14c0bfb)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/73bbc0e1-852d-9410-4abc-fc1c8e7e39a4.png)|
|[item](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#item)|配列に対する繰り返しアクションの内部で使うと、アクションの現在の繰り返しの間に配列の現在の項目を返します。|ループ時のCurrent Item|
|[join](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#join)|配列の "すべて" の項目を含み、指定された区切り記号で各項目が区切られた、文字列を返します。|配列から文字列への変換|
|[last](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#last)|コレクションから最後の項目を返します。|－|
|[length](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#length)|文字列または配列内の項目の数を返します。|－|
|:new: [reverse](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#reverse)|コレクション内の項目の順序を逆にします。 sort() とともにこの関数を使用すると、コレクションを降順で並べ替えることができます。|－|
|[skip](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#skip)|コレクションの先頭から項目を削除し、"他のすべて" の項目を返します。|－|
|:new: [sort](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#sort)|コレクション内の項目を並べ替えます。 単純型を含む任意のキーを使用して、コレクション オブジェクトを並べ替えることができます。|ー|
|[take](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#take)|コレクションの先頭から項目を返します。|－|
|[union](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#union)|指定した複数のコレクションの "すべての" 項目を含む 1 つのコレクションを返します。|Concat().Distinct()|

## 応用
| 概要 | 方法 | |
|:-:|:-:|:-:|
|  Distinct |  Union() に同一配列を設定で、重複削除可能 <br>例）<code>union(variables('Json1'),variables('Json2'))</code>| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/7d028969-c7d6-7da2-432e-780ee9a19ec9.png)  |
|  Except 差集合 1 | 二重ループとかで対処 <br> [実装例 at 英語サイト](https://powerusers.microsoft.com/t5/Building-Flows/quot-Except-quot-Operation-in-Flow/td-p/393762)  | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f3e21d5e-9a66-6ce0-a746-8e43c786a881.png)  |
| Except 差集合 2  | Office Scriptsで実現<br> [詳細はこちら](https://qiita.com/baku2san/items/d05321012e0cbf833f2b) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/e3c8b7cc-2fe8-9b67-827c-d9ef073972e1.png)  |
| Except <br><font color=red>差集合<br>決定版</font>|Select & Filter Array で簡単に超高速<br>[詳細はこちら](https://qiita.com/baku2san/items/a1490cab663cdf37e0cb) ||
| Join マージ|1. Except()と同様にLoopで・・<br>2. Office Scriptsで・・・面倒そう ||
|配列同士での Exists()|Empty(Intersection(Array1, Array2)) で、空で非存在。処理したいリストに対してLoopをかけるのではなく積で対象を見つけて処理すると良さげ|

# あとがき
思い出しつつ追記することにしよう・・

# keyword
how to modify collections by functions and connectors