マップ関数
Mapはキーと値のペアのセット、つまりJSONオブジェクト用のWEL型です。マップ関数は、そのキーと値の読み取り、あるマップと別のマップの結合、フィールドの削除、およびリスト関数が操作できるようにマップとリストの間の変換を行います。
キーは常にStringです。挿入順序は保持されるため、意図した順序で作成されたマップはその順序でシリアル化されます。
_ は、これらの例で式が受け取る入力です。詳細については、入力変数を参照してください。
機能の提供状況
WELは現在、一部のお客様にご利用いただけます。ご利用のワークスペースで利用可能かどうかを確認するには、Customer Success Representativeにお問い合わせください。
マップ関数を呼び出す
関数を直接呼び出すか、>>を使用して値をパイプします:
keys(_.customer)
_.customer >> keysフィールドはピリオド(.)で読み取ります。キーが計算される場合やベア識別子でない場合は、角かっこ([])を使用します。
_.customer.email
_.customer['email']存在しないキーを読み取るとE104が発生します。最初にテストするにはhas_key?を使用し、デフォルトを指定するにはtry-fallback演算子|?を使用します。
_.customer.nickname |? 'none'キーと値の読み取り
次の関数は、マップを変更せずにマップのキーと値を読み取ります。
keys
キーを挿入順序でリストとして返します。
keys(map)| パラメーター | 説明 |
|---|---|
| map | 読み取るマップ。 |
マップのキーを取得する
次の例は、マップのキーを挿入順序で返します。
Formula
keys({sku: 'WID-1', qty: 3})出力
["sku", "qty"]values
値を挿入順序でリストとして返します。 Skipである値は省略されます。
values(map)| パラメーター | 説明 |
|---|---|
| map | 読み取るマップ。 |
マップの値を取得する
次の例は、マップの値を挿入順序で返します。
Formula
values({sku: 'WID-1', qty: 3})出力
["WID-1", 3]has_key?
キーが存在する場合はtrueを返します。
キーのテストは、値のテストと同じではありません。 null値を持つキーが存在する場合、ここではtrueを返します。使用可能な値をテストするには、代わりにpresent?を使用します。
has_key?(map, key)| パラメーター | 説明 |
|---|---|
| map | テストするマップ。 |
| key | Stringとしてのキー名。 |
存在するキーはtrueを返す
次の例は、マップに存在するキーをテストします。
Formula
has_key?({sku: 'WID-1'}, 'sku')出力
true存在しないキーはfalseを返す
次の例は、マップに存在しないキーをテストします。
Formula
has_key?({sku: 'WID-1'}, 'qty')出力
falseフィールドの選択
次の関数は、マップをより小さく安全なフィールドのセットに絞り込みます。
pluck
指定されたキーのみを含むマップを返します。存在しないキーは、エラーを発生させるのではなくスキップされます。
これを使用して、大きな受信レコードを宛先が実際に受け入れるフィールドに絞り込みます。
pluck(map, keys)| パラメーター | 説明 |
|---|---|
| map | 読み取り元のマップ。 |
| keys | 保持するキー名のリスト。 |
指定されたキーのみを保持する
次の例は、マップから指定されたキーのみを保持します。
Formula
pluck({id: 1, secret: 'x', name: 'a'}, ['id', 'name'])出力
{id: 1, name: "a"}存在しないキーは、エラーを発生させるのではなくスキップされる
次の例は、存在しないキーをpluckします。このキーは、エラーを発生させるのではなくスキップされます。
Formula
pluck({id: 1}, ['id', 'missing'])出力
{id: 1}except
指定されたキーを削除したマップを返します。
pluckとexceptは反対の機能であり、安全性の観点ではどちらを選ぶかが重要です。 pluckは許可リストであるため、アップストリームに新しいフィールドが現れてもデフォルトで破棄されます。 exceptは拒否リストであるため、新しいフィールドはデフォルトで転送されます。新しく追加されたフィールドの漏えいが懸念される場合は、pluckを優先します。
except(map, keys)| パラメーター | 説明 |
|---|---|
| map | 読み取り元のマップ。 |
| keys | 削除するキー名のリスト。 |
指定されたキーを削除する
次の例は、マップから指定されたキーを削除します。
Formula
except({id: 1, secret: 'x', name: 'a'}, ['secret'])出力
{id: 1, name: "a"}ユースケース:転送前に機密フィールドを削除する
受信ユーザーレコードには、宛先システムに届くべきではない資格情報が含まれています。レコードを転送する前に機密フィールドを削除するには、exceptを使用します。
入力
{
"user": {
"id": "U-1",
"email": "nur@example.com",
"password": "hunter2",
"ssn": "111-22-3333"
}
}Formula
_.user >> except(['password', 'ssn'])出力
{"id": "U-1", "email": "nur@example.com"}このexceptの使用は拒否リスト形式であり、ソースが送信できるすべてのフィールドを把握している間だけ安全です。ソースがフィールドを追加する可能性がある場合、pluck(['id', 'email'])は同じ意図を表すより安全な式です。
マップの結合
次の関数は、2つのマップを1つに結合します。
merge
2つのマップを結合します。両方で同じキーが定義されている場合は、2番目が優先されます。
merge(first, second)| パラメーター | 説明 |
|---|---|
| first | ベースマップ。 |
| second | 値が優先されるマップ。 |
2つのマップをマージする。競合時は2番目が優先される
次の例は2つのマップをマージします。共有キーでは2番目のマップの値が優先されます。
Formula
merge({sku: 'WID-1', qty: 1}, {qty: 5})出力
{sku: "WID-1", qty: 5}ユースケース:デフォルトセットにオーバーライドを適用する
デフォルトのセットに呼び出し元が指定したオーバーライドを重ねて適用する必要があります。指定されたものはすべて優先され、省略されたものはフォールバックされます。 mergeでは、デフォルトを1番目に、呼び出し元の値を2番目に指定します。
入力
{
"overrides": {"currency": "EUR", "notify": true}
}Formula
merge(
{currency: 'USD', locale: 'en-US', notify: false},
_.overrides
)出力
{"currency": "EUR", "locale": "en-US", "notify": true}mergeは1つのレベルを結合します。 2番目の引数にあるネストされたマップは、対応するマップにマージされるのではなく、そのまま置き換えます。
マップとリストの間の変換
これら4つの関数によって、マップはリスト関数に到達できます。 entriesとpairsは一方向に変換します。 from_entriesとfrom_pairsは元に戻します。
entries
マップを{key, value}マップのリストに変換します。
entries(map)| パラメーター | 説明 |
|---|---|
| map | 変換するマップ。 |
マップをキー/値マップのリストに変換する
次の例は、マップを{key, value}マップのリストに変換します。
Formula
entries({sku: 'WID-1', qty: 3})出力
[{key: "sku", value: "WID-1"}, {key: "qty", value: 3}]from_entries
{key, value}マップのリストをマップに戻します。 entriesの逆です。
from_entries(list)| パラメーター | 説明 |
|---|---|
| list | それぞれにkeyとvalueを持つマップのリスト。 |
キー/値マップのリストをマップに戻す
次の例は、{key, value}マップのリストをマップに戻します。
Formula
from_entries([{key: 'sku', value: 'WID-1'}])出力
{sku: "WID-1"}pairs
マップを2要素の[key, value]リストのリストに変換します。値がSkipであるペアは省略されます。
pairs(map)| パラメーター | 説明 |
|---|---|
| map | 変換するマップ。 |
マップをキー/値ペアのリストに変換する
次の例は、マップを2要素の[key, value]リストのリストに変換します。
Formula
pairs({sku: 'WID-1', qty: 3})出力
[["sku", "WID-1"], ["qty", 3]]from_pairs
2要素の[key, value]リストのリストをマップに戻します。 pairsの逆です。
from_pairs(list)| パラメーター | 説明 |
|---|---|
| list | 2要素リストのリスト。 |
キー/値ペアのリストをマップに戻す
次の例は、2要素の[key, value]リストのリストをマップに戻します。
Formula
from_pairs([['sku', 'WID-1']])出力
{sku: "WID-1"}変換せずにマップをフィルターする
filter_byはマップを直接受け入れます。ラムダはキーと値の2つのパラメーターを受け取り、結果はマップになります。
{a: 1, b: 2} >> filter_by((k, v) ~> v > 1)ネストされたマップのフラット化
次の関数は、ネストされたマップを単一レベルに折りたたみ、パスを1つのキーに結合します。
flatten_map
ネストされたマップを単一レベルに折りたたみ、パスを1つのキーに結合します。
走査は挿入順序で深さ優先です。マップのみが下位にたどられます。リストはリーフ値として扱われ、全体が保持されます。空のネストされたマップもリーフです。
2つのネストされたキーが、同じフラット化されたキーに折りたたまれることがあります。最後の書き込みが優先され、その場合はE229警告が発行されるため、競合はサイレントではなくジョブ内で確認できます。
flatten_map(map, options)| パラメーター | 説明 |
|---|---|
| map | フラット化するマップ。 |
| options | フラット化を制御するオプションのマップ。
|
認識されないオプションキーは無視されず、E222を発生させます。
デフォルトの区切り文字でネストされたマップをフラット化する
次の例は、デフォルトの.区切り文字でパスを結合して、ネストされたマップをフラット化します。
Formula
flatten_map({customer: {name: 'Nur', address: {city: 'London'}}})出力
{"customer.name": "Nur", "customer.address.city": "London"}カスタム区切り文字でネストされたマップをフラット化する
次の例は、カスタム区切り文字を使用してネストされたマップをフラット化します。
Formula
flatten_map({a: {b: 1}}, {sep: '_'})出力
{a_b: 1}ユースケース:CSV行用にレコードをフラット化する
CSVの宛先ではフィールドごとに1つの列が必要ですが、ソースは2レベルの深さでネストされています。マップ関数を使用して、レコードを単一レベルにフラット化します。
入力
{
"record": {
"id": "C-1",
"customer": {
"name": "Nur",
"address": {"city": "London", "postcode": "E1"}
}
}
}Formula
_.record >> flatten_map出力
{
"id": "C-1",
"customer.name": "Nur",
"customer.address.city": "London",
"customer.address.postcode": "E1"
}フラット化されたキーは、宛先が期待する列ヘッダーそのものです。ターゲットがヘッダー名のドットを受け入れない場合は、{sep: '_'}を渡します。
関連情報
最終更新日: