ディープマップ関数
ディープマップ関数は、1つのレベルを操作するのではなく、ネストされたすべてのマップとリストを通じて構造全体を走査します。 APIレスポンスの形状が変動する場合、ターゲット値が任意の深度に存在する可能性がある場合、またはルールを場所に関係なくすべてのリーフに適用する必要がある場合に使用します。
機能の提供状況
WELは現在、一部のお客様にご利用いただけます。ご利用のワークスペースで利用可能かどうかを確認するには、Customer Success Representativeにお問い合わせください。
ユースケース
事前に値の場所がわかっている場合は、明示的なパスを優先します。たとえば、_.order.customer.emailは意味を明確に示し、形状が変わると明示的に失敗し、ペイロード内の別の場所にある無関係なemailを取得することはありません。
次の場合にディープ関数を使用します:
- ペイロードによって深度が実際に変わる場合。
- すべての文字列をトリムする、またはすべての
Binaryをエンコードするなど、位置に関係なく、ある種類のすべての値にルールを適用する場合。 - 目的が、既知の1つのフィールドではなく、対象のすべての出現を収集することである場合。
ワイルドカード、インデックス指定、またはスライスを使用するパスクエリには、代わりにjson_pathを使用します。
ディープウォークは意図した以上にマッチします
deep_collect(_, 'id')はペイロード内のすべてのidを返します:注文のもの、顧客のもの、各明細項目のもの。それがこの関数の目的であり、同時に主な危険性でもあります。そのうち1つだけを取得するには、そのパスを指定します。
値の収集
どちらのコレクターも、マップとリストを深さ優先の先行順で走査します。マッチした値自体がマップまたはリストである場合、その値は収集され、かつその内部も走査されます。 shallowにtrueを渡すと、マッチしたコンテナーを収集しますが、その内部は走査しません。
deep_collect
指定された名前とマップキーが一致するすべての値を、任意の深度で収集します。
deep_collect(value, key, shallow)| パラメーター | 説明 |
|---|---|
| value | 走査する構造。 |
| key | マッチするキー名。Stringとして指定します。 |
| shallow | 任意のBoolean。マッチしたコンテナーは収集されますが、trueの場合はその内部が走査されません。デフォルトはfalseです。 |
任意の深度にあるすべてのidを収集
次の例では、任意の深度にあるすべてのid値を収集します:
Formula
deep_collect({order: {id: 'SO-1', customer: {id: 'C-9'}}}, 'id')出力
["SO-1", "C-9"]deep_collect_by
述語がtrueを返すすべての値を収集します。述語はキーと値を受け取るため、どちらか一方または両方に基づいてマッチできます。
deep_collect_by(value, predicate, shallow)| パラメーター | 説明 |
|---|---|
| value | 走査する構造。 |
| predicate | (key, value)を受け取り、Booleanを返すラムダ。 |
| shallow | 任意のBoolean。マッチしたコンテナーは収集されますが、trueの場合はその内部が走査されません。デフォルトはfalseです。 |
キーと値の述語に一致する値を収集
次の例では、キーがAmountで、値が10を超える値を収集します:
Formula
deep_collect_by({order: {Amount: 5}, items: [{Amount: 20}]}, (k, v) ~> k == 'Amount' and v > 10)出力
[20]ユースケース:ペイロード内のすべてのメールアドレスを収集
CRMレスポンスでは複数の場所にアドレスが含まれ、同じアドレスが2回出現することがあります。ディープマップ関数を使用してそれらをすべて収集し、その後重複を排除します:
入力
{
"primary": {"email": "nur@example.com"},
"contacts": [
{"email": "dana@example.com"},
{"email": "nur@example.com"}
]
}Formula
deep_collect(_, 'email') >> unique出力
["nur@example.com", "dana@example.com"]deep_collectは、どちらのパスも指定しなくても、トップレベルのマップとネストされたリストの両方に到達します。 uniqueは各アドレスの最初の出現を保持します。
リーフの変換
次の関数は、深度に関係なく、条件に一致する構造内のすべてのリーフ値を変換します:
deep_map_values_by
構造全体を走査してリーフ値に変換を適用し、同じ形状の構造を返します。
オプションの2つ目のラムダで、変換するリーフを選択します。拒否された値は、元のまま残されます。この動作により、型固有のルールを混合型のペイロード全体に安全に適用できます。
deep_map_values_by(value, transform, condition)| パラメーター | 説明 |
|---|---|
| value | 走査する構造。 |
| transform | 選択された各リーフの新しい値を返すラムダ。 |
| 条件 | 各リーフに対してBooleanを返すオプションのラムダ。省略した場合、すべてのリーフが変換されます。 |
すべてのリーフ値を乗算
次の例では、ネストされた構造内のすべてのリーフ値を乗算します:
Formula
deep_map_values_by({a: 1, b: [2, 3]}, x ~> x * 10)出力
{a: 10, b: [20, 30]}ユースケース:インバウンドペイロード内のすべての文字列をトリム
ソースシステムからの空白文字は、任意の深度の任意のフィールドに出現する可能性があります。ディープマップ関数を使用して、文字列以外の値はそのままにし、1回のパスですべてのフィールドをトリムします:
入力
{
"customer": {
"name": " Nur ",
"tags": [" vip ", "new"]
},
"qty": 3
}Formula
deep_map_values_by(
_,
v ~> trim(v),
v ~> type_of(v) == 'String'
)出力
{
"customer": {"name": "Nur", "tags": ["vip", "new"]},
"qty": 3
}条件ラムダによって、これが安全になります。これがない場合、trimはqtyに対して実行され、E100を発生させます。これは、WELが呼び出しを成功させるために数値を文字列へ強制変換しないためです。
関連情報
最終更新日: