配列のマップとフラット化

flatMap​ 関数は、入力に対して ​map​ をコールし、その結果をラップして ​flatten​ をコールします。 開始する前に、DataWeave バージョン 2 (​%dw 2.0​) は Mule 4 アプリケーションを対象とすることに注意してください。Mule 3 アプリケーションの場合、Mule 3.9 ドキュメントセットの DataWeave バージョン 1 (​%dw 1.0​) の例を参照してください。他の Mule バージョンの場合は、目次の Mule Runtime バージョンセレクターを使用できます。

flatMap​ 関数は、​map​ へのコールの結果に対して ​flatten​ の使用をリファクタリングする場合に役立ちます。たとえば、次の DataWeave スクリプトについて考えてみます。

DataWeave スクリプト:
%dw 2.0
output application/json
var myData = [{name:1},{name:2},{name:3}]
fun myExternalFunction(data): Array =
    if(data.name == 1)
        []
    else if(data.name == 2)
        [{name: 3}, {name:5}]
    else
        [data]
---
//flatten(myData map ((item, index) -> myExternalFunction(item)))
myData flatMap ((item, index) -> myExternalFunction(item))

スクリプトのヘッダーでは、変数 ​myData​ を作成してオブジェクトの配列を定義しています。各オブジェクトにはキー ​name​ が含まれています。またここでは、キー ​name​ を含む名前-値ペアに対して実行する一連の if-else ステートメントを含む関数も定義しています。

DataWeave スクリプトの本文には、次の式が含まれています。いずれも結果は同じです。

  • flatten(myData map ((item, index) → myExternalFunction(item)))

  • myData flatMap ((item, index) → myExternalFunction(item))

flatMap​ 式を使用する場合でも、明示的に ​flatten​ を使用して ​map​ 式をラップする場合でも、次のことが実行されます。

  1. ヘッダーで定義された関数 ​myExternalFunction()​ の if-else 条件に従って入力配列の項目がマップされます。

    このマッピングの出力は次のようになります。

    [
      [
      ],
      [
        { "name": 3 },
        { "name": 5 }
      ],
      [
        { "name": 3 }
      ]
    ]
  2. サブ配列の要素を 1 つの配列にまとめ、親配列を削除し、空の子配列を除外することによって、マップされた結果がフラット化されます。

    このフラット化の出力は次のようになります。

    出力 JSON:
    [
      {
        "name": 3
      },
      {
        "name": 5
      },
      {
        "name": 3
      }
    ]

関連情報