リスト関数
リスト関数は順序付きコレクションを操作します。ほとんどの連携作業はリスト作業です。 webhookはレコードの配列を配信し、APIは結果のページを返し、宛先システムは異なる形状、異なる順序、または単一の集計数値を想定します。
_ は、これらの例で式が受け取る入力です。詳細については、入力変数を参照してください。
機能の提供状況
WELは現在、一部のお客様にご利用いただけます。ご利用のワークスペースで利用可能かどうかを確認するには、Customer Success Representativeにお問い合わせください。
リスト関数の呼び出し
関数を直接呼び出すか、>>を使用して値をパイプします:
count(_.line_items)
_.line_items >> countリスト関数は連鎖に適しており、パイプ形式により複数ステップの変換を読みやすくできます:
_.orders >> filter_by(o ~> o.status == 'open') >> map_by(o ~> o.id)Lambda
多くのリスト関数は、~>で記述された小さなインライン関数であるlambdaを受け取ります:
_.orders >> filter_by(order ~> order.total > 100)~>の前のパラメーターには任意の名前を選択できます。これは一度に1つの要素を参照します。 2つ以上のパラメーターは括弧(())で囲みます:
_.items >> map_with_index_by((item, index) ~> f"{index + 1}. {item.name}")->と=>はラムダ矢印ではありません
WELでは、ラムダに~>のみを使用します。 x -> x * 2またはx => x * 2を記述すると、パースエラーが発生します。これは、他の言語に精通しているユーザーやAIに最もよくある誤りです。他の言語では、ラムダに->または=>を使用することがよくあります。 AIエージェントにWELを扱うために必要なコンテキストを提供するには、WELキットを参照してください。
リストの検査
次の関数はリストを変更せずに読み取ります:
count
要素数を返します。
count(list)| パラメーター | 説明 |
|---|---|
| list | 測定するリスト。 |
空でないリストの要素をカウント
次の例では、空でないリストの要素をカウントします:
Formula
count(['SO-1', 'SO-2', 'SO-3'])出力
3空のリストの要素をカウント
次の例では、空のリストの要素をカウントします:
Formula
count([])出力
0first
最初の要素を返します。リストが空の場合はnullを返します。
first(list)| パラメーター | 説明 |
|---|---|
| list | 読み取り元のリスト。 |
リストの最初の要素を取得
次の例では、リストの最初の要素を取得します:
Formula
first(['pending', 'shipped'])出力
保留中空のリストには最初の要素がない
次の例では、空のリストに対してnullを返します:
Formula
first([])出力
nulllast
最後の要素を返します。リストが空の場合はnullを返します。
last(list)| パラメーター | 説明 |
|---|---|
| list | 読み取り元のリスト。 |
リストの最後の要素を取得
次の例では、リストの最後の要素を取得します:
Formula
last(['pending', 'shipped'])出力
shippedat
ゼロベースのインデックスにある要素を返します。負のインデックスは末尾から逆に数えます。
リスト範囲外のインデックスはE201を発生させます。末尾または先頭だけが必要な場合は、firstまたはlastを使用します。位置ではなく要素を検索するには、find_byを使用します。
at(list, index)| パラメーター | 説明 |
|---|---|
| list | 読み取り元のリスト。 |
| インデックス | ゼロベースの位置。負の値は末尾から数えます。 |
正のインデックスにある要素を取得
次の例では、インデックス0にある要素を取得します:
Formula
at(['pending', 'shipped', 'closed'], 0)出力
保留中負のインデックスにある要素を取得
次の例では、負のインデックスを使用して最後の要素を取得します:
Formula
at(['pending', 'shipped', 'closed'], -1)出力
closedone!
1要素のリストの単一要素を返し、それ以外の長さの場合はE204を発生させます。
アサーションとして使用します。 one!は、lookupが正確に1件のレコードに一致する必要がある場合に、「ゼロまたは多数」を、誤ったレコードで静かに処理を続行する変換ではなく、明確に失敗するジョブに変えます。
one!(list)| パラメーター | 説明 |
|---|---|
| list | 正確に1つの要素を保持することが想定されるリスト。 |
1要素のリストから単一要素を抽出
次の例では、1要素のリストから単一要素を抽出します:
Formula
one!(['SO-1001'])出力
SO-1001リストのテスト
次の関数は新しいリストを返すのではなく、リストに関する質問に答えます:
all?
すべての要素がpredicateを満たす場合にtrueを返します。空のリストはtrueを返します。
all?(list, predicate)| パラメーター | 説明 |
|---|---|
| list | テストするリスト。 |
| predicate | 各要素に対してBooleanを返すlambda。 |
すべての要素がpredicateに一致するかをテスト
次の例では、すべての要素が'open'であるかをテストします:
Formula
['open', 'open'] >> all?(s ~> s == 'open')出力
trueany?
少なくとも1つの要素がpredicateを満たす場合にtrueを返します。
any?(list, predicate)| パラメーター | 説明 |
|---|---|
| list | テストするリスト。 |
| predicate | 各要素に対してBooleanを返すlambda。 |
いずれかの要素がしきい値を超えるかをテスト
次の例では、いずれかの要素が100より大きいかをテストします:
Formula
[199, 42, 8] >> any?(n ~> n > 100)出力
truefind_by
predicateを満たす最初の要素を返します。該当するものがない場合はnullを返します。
find_by(list, predicate)| パラメーター | 説明 |
|---|---|
| list | 検索するリスト。 |
| predicate | 各要素に対してBooleanを返すlambda。 |
フィールド値でレコードを検索
次の例では、SKUが一致する最初のレコードを検索します:
Formula
[{id: 1, sku: 'WID-1'}, {id: 2, sku: 'GAD-7'}] >> find_by(r ~> r.sku == 'GAD-7')出力
{id: 2, sku: "GAD-7"}find_first_index
predicateを満たす最初の要素のゼロベースのインデックスを返します。該当するものがない場合は-1を返します。
find_first_index(list, predicate)| パラメーター | 説明 |
|---|---|
| list | 検索するリスト。 |
| predicate | 各要素に対してBooleanを返すlambda。 |
一致する要素のインデックスを検索
次の例では、'c'と等しい要素のインデックスを検索します:
Formula
['a', 'b', 'c'] >> find_first_index(s ~> s == 'c')出力
2predicateに一致する要素がない
次の例では、一致する要素がない場合に-1を返します:
Formula
['a', 'b'] >> find_first_index(s ~> s == 'z')出力
-1要素の選択
次の関数は元のリストから構築された短いリストを返します:
filter_by
predicateがtrueを返す要素を保持します。
Mapも受け取ります。その場合、lambdaはkeyとvalueの2つのパラメーターを受け取ります。結果もMapです。
filter_by(list, predicate)| パラメーター | 説明 |
|---|---|
| list | フィルターするリストまたはmap。 |
| predicate | Booleanを返すlambda。 |
しきい値を超える値にリストをフィルター
次の例では、2より大きい要素のみを保持します:
Formula
[1, 2, 3, 4] >> filter_by(n ~> n > 2)出力
[3, 4]take
最初のcount個の要素を返します。countが負の場合は最後のcount個の要素を返します。リストが保持する数より多く要求すると、エラーを発生させるのではなくリスト全体を返します。
take(list, count)| パラメーター | 説明 |
|---|---|
| list | 読み取り元のリスト。 |
| count | 要素数。負の値は末尾から取得します。 |
先頭から要素を取得
次の例では、最初の2つの要素を取得します:
Formula
take(['a', 'b', 'c', 'd'], 2)出力
["a", "b"]末尾から要素を取得
次の例では、負のcountを使用して最後の2つの要素を取得します:
Formula
take(['a', 'b', 'c', 'd'], -2)出力
["c", "d"]drop
最初のcount個の要素を削除します。countが負の場合は最後のcount個の要素を削除します。
drop(list, count)| パラメーター | 説明 |
|---|---|
| list | 読み取り元のリスト。 |
| count | 削除する要素数。負の値は末尾から削除します。 |
先頭から要素を削除
次の例では、最初の2つの要素を削除します:
Formula
drop(['a', 'b', 'c', 'd'], 2)出力
["c", "d"]compact
nullとSkipの値を削除します。
一部の要素に対してのみ値を生成するmap_byの直後や、受信payloadから任意フィールドを取り除く場合に便利です。
compact(list)| パラメーター | 説明 |
|---|---|
| list | クリーンアップするリスト。 |
リストからnull値を削除
次の例では、リストからnull値を削除します:
Formula
compact(['a', null, 'b'])出力
["a", "b"]unique
重複を削除し、各値の最初の出現を元の位置に保持します。
unique(list)| パラメーター | 説明 |
|---|---|
| list | 重複排除するリスト。 |
リストから重複値を削除
次の例では、最初の出現を保持しながら重複値を削除します:
Formula
unique(['WID-1', 'GAD-7', 'WID-1'])出力
["WID-1", "GAD-7"]unique_by
key関数で重複を削除し、各keyの最初の要素を保持します。
レコードで使用します。2つのエントリは、オブジェクト全体は異なっていても識別子を共有しているため「同じ」と見なされます。
unique_by(list, key)| パラメーター | 説明 |
|---|---|
| list | 重複排除するリスト。 |
| key | 比較に使用する値を返すlambda。 |
keyフィールドでレコードを重複排除
次の例では、各SKUの最初のレコードを保持します:
Formula
[{sku: 'WID-1'}, {sku: 'WID-1'}] >> unique_by(r ~> r.sku)出力
[{sku: "WID-1"}]ユースケース: webhookバッチから有効なレコードを保持
webhookは、一部のレコードでメールアドレスが欠落し、1つの識別子が繰り返されるバッチを配信します。リスト関数を使用して、識別子ごとに1つのレコードを保持し、配信先のメールがないものを削除します:
入力
{
"contacts": [
{"id": "C-1", "email": "nur@example.com"},
{"id": "C-2", "email": null},
{"id": "C-1", "email": "nur@example.com"},
{"id": "C-3", "email": "dana@example.com"}
]
}Formula
_.contacts
>> unique_by(c ~> c.id)
>> filter_by(c ~> present?(c.email))
>> map_by(c ~> c.email)出力
["nur@example.com", "dana@example.com"]unique_byはfilter_byの前に実行されるため、重複はメールアドレスの有無ではなくIDに基づいて削除されます。
要素の変換
次の関数は同じ長さのリストを返すか、構造を変形します:
map_by
すべての要素にlambdaを適用し、結果を返します。
lambdaがSkipを返す要素は省略されるため、map_byは同じパスでフィルターと変換を実行できます。
map_by(list, transform)| パラメーター | 説明 |
|---|---|
| list | 変換するリスト。 |
| transform | 各要素の新しい値を返すlambda。 |
リストの各要素を2倍にする
次の例では、リストの各要素を2倍にします:
Formula
[1, 2, 3] >> map_by(n ~> n * 2)出力
[2, 4, 6]map_with_index_by
要素とそのゼロベースのインデックスを受け取る2パラメーターのlambdaを適用します。
map_with_index_by(list, transform)| パラメーター | 説明 |
|---|---|
| list | 変換するリスト。 |
| transform | (element, index)を受け取るlambda。 |
リストの各要素に番号を付ける
次の例では、インデックスを使用して各要素に番号を付けます:
Formula
['a', 'b'] >> map_with_index_by((s, i) ~> f"{i + 1}. {s}")出力
["1. a", "2. b"]flatten
ネストを1レベルだけフラット化します。 2階層深くネストされたリストでは内側のリストが保持されるため、さらに進むにはflattenを再度呼び出します。
flatten(list)| パラメーター | 説明 |
|---|---|
| list | フラット化するリストのリスト。 |
リストのリストをフラット化
次の例では、リストのリストを1レベルフラット化します:
Formula
flatten([[1, 2], [3]])出力
[1, 2, 3]Flattenはネストを1レベルだけ削除
次の例では、2レベル深くネストされたリストで内側のリストが保持されることを示します:
Formula
[[1, 2], [3, [4]]] >> flatten出力
[1, 2, 3, [4]]zip
2つのリストの要素を2要素リストにペア化します。短い方のリストが長さを決定します。
zip(first, second)| パラメーター | 説明 |
|---|---|
| first | 最初のリスト。 |
| second | 2番目のリスト。 |
同じ長さの2つのリストをペア化
次の例では、同じ長さの2つのリストをペア化します:
Formula
zip(['sku', 'qty'], ['WID-1', 3])出力
[["sku", "WID-1"], ["qty", 3]]短い方のリストが結果の長さを決定
次の例は、短い方のリストが結果の長さを決定することを示します:
Formula
zip(['a', 'b', 'c'], [1])出力
[["a", 1]]reverse
要素の順序を反転します。
reverse(list)| パラメーター | 説明 |
|---|---|
| list | 反転するリスト。 |
リストの順序を反転
次の例では、リストの順序を反転します:
Formula
reverse(['a', 'b', 'c'])出力
["c", "b", "a"]リストの並べ替え
次の関数は、リストを昇順かつ安定的にソートします:
sort
昇順にソートします。ソートは安定しているため、比較で等しい要素は元の相対順序を保持します。
sort(list)| パラメーター | 説明 |
|---|---|
| list | ソートするリスト。 |
リストを昇順にソート
次の例では、リストを昇順にソートします:
Formula
sort([3, 1, 2])出力
[1, 2, 3]sort後に反転して降順にソート
次の例では、昇順にソートしてから反転し、降順を取得します:
Formula
[3, 1, 2] >> sort >> reverse出力
[3, 2, 1]sort_by
key関数で昇順かつ安定的にソートします。
降順のバリアントはありません。降順にするには、結果をreverseにパイプします。
sort_by(list, key)| パラメーター | 説明 |
|---|---|
| list | ソートするリスト。 |
| key | ソートに使用する値を返すlambda。 |
フィールドでレコードをソート
次の例では、レコードをnフィールドでソートします:
Formula
[{n: 'b'}, {n: 'a'}] >> sort_by(r ~> r.n)出力
[{n: "a"}, {n: "b"}]ユースケース: 上位3つの最大注文を取得
レポートでは、バッチから抽出された上位3つの最大注文が必要です。昇順にソートし、反転してから先頭から取得します:
入力
{
"orders": [
{"id": "SO-1", "amount": 120},
{"id": "SO-2", "amount": 940},
{"id": "SO-3", "amount": 310},
{"id": "SO-4", "amount": 75}
]
}Formula
_.orders
>> sort_by(o ~> o.amount)
>> reverse
>> take(3)
>> map_by(o ~> o.id)出力
["SO-2", "SO-3", "SO-1"]グループ化と分割
次の関数は、keyまたはpredicateに基づいてリストをグループまたは2つのバケットに分割します:
group_by
key関数の結果をkeyとするMapに要素をグループ化します。各値は、そのkeyを共有する要素のリストです。
group_by(list, key)| パラメーター | 説明 |
|---|---|
| list | グループ化するリスト。 |
| key | グループ化keyを返すlambda。 |
keyフィールドでレコードをグループ化
次の例では、レコードをSKUでグループ化します:
Formula
[{sku: 'WID-1', q: 1}, {sku: 'GAD-7', q: 2}, {sku: 'WID-1', q: 5}] >> group_by(r ~> r.sku)出力
{"WID-1": [{sku: "WID-1", q: 1}, {sku: "WID-1", q: 5}], "GAD-7": [{sku: "GAD-7", q: 2}]}partition_by
リストを正確に2つのリストに分割します: predicateに一致する要素、その後に一致しない要素。
結果は常に2要素のリストなので、at(0)とat(1)で読み取ります。
partition_by(list, predicate)| パラメーター | 説明 |
|---|---|
| list | 分割するリスト。 |
| predicate | Booleanを返すlambda。 |
predicateでリストを分割
次の例では、リストを一致する要素と一致しない要素に分割します:
Formula
[1, 2, 3, 4] >> partition_by(n ~> n > 2)出力
[[3, 4], [1, 2]]結果から一致する要素を読み取る
次の例では、分割された結果から一致する要素のみを読み取ります:
Formula
[1, 2, 3, 4] >> partition_by(n ~> n > 2) >> at(0)出力
[3, 4]ユースケース: バッチ結果を成功と失敗に分割
bulk APIは、行ごとのステータスを持つレコードを行ごとに1件返します。 partition_byを使用してそれらを分割します。これにより、成功は続行し、失敗は再試行パスにルーティングできます:
入力
{
"results": [
{"id": "A", "status": "ok"},
{"id": "B", "status": "error"},
{"id": "C", "status": "ok"}
]
}Formula
let parts = _.results >> partition_by(r ~> r.status == 'ok')
do {
succeeded: parts >> at(0) >> map_by(r ~> r.id),
failed: parts >> at(1) >> map_by(r ~> r.id)
}出力
{"succeeded": ["A", "C"], "failed": ["B"]}let … doは分割を1回だけバインドするため、リストは2回ではなく1回だけパーティション化されます。
集計
次の関数はリストを1つの値に縮約します:
sum
数値要素を加算します。空のリストの合計は0です。
sum(list)| パラメーター | 説明 |
|---|---|
| list | 数値のリスト。 |
floatのリストを合計
次の例では、floatのリストを合計します:
Formula
sum([12.50, 99.00])出力
111.5スケールを保持するためにdecimalのリストを合計
次の例では、Decimal値のリストを合計し、元のスケールを保持します:
Formula
sum([Decimal('12.50'), Decimal('99.00')])出力
111.50空のリストの合計はゼロ
次の例では、空のリストを合計します:
Formula
sum([])出力
0金額はFLOATではなくDECIMALとして合計
sum([12.50, 99.00])とsum([Decimal('12.50'), Decimal('99.00')])の例は、異なる型に対して同じ算術演算を実行します。 12.50はFloatであるため、合計は111.5になり、スケールは失われます。 Decimal('12.50')は正確であるため、合計は111.50です。これは後続のすべてのステップを通じて通貨金額のままです。
Transform Dataアクションでのスキーマ推論では、金額に対してDecimalは生成されません。宣言方法については、Transform dataアクションを参照してください。
avg
数値要素の平均を返します。空のリストはE207を発生させます。何もないものの有意な平均は存在しないためです。
avg(list)| パラメーター | 説明 |
|---|---|
| list | 数値のリスト。 |
数値のリストを平均
次の例では、数値のリストを平均します:
Formula
avg([10, 20, 30])出力
20min
最小の要素を返します。数値だけでなく文字列にも対応します。
min(list)| パラメーター | 説明 |
|---|---|
| list | 縮約するリスト。 |
リスト内の最小の数値を検索
次の例では、リスト内の最小の数値を検索します:
Formula
min([5, 2, 9])出力
2max
最大の要素を返します。数値だけでなく文字列にも対応します。
max(list)| パラメーター | 説明 |
|---|---|
| list | 縮約するリスト。 |
リスト内の最大の数値を検索
次の例では、リスト内の最大の数値を検索します:
Formula
max([5, 2, 9])出力
9リスト内の最大の文字列を検索
次の例では、リスト内の最大の文字列を検索します:
Formula
max(['apple', 'pear'])出力
pearreduce_by
accumulatorを使用してリストを単一の値に畳み込みます。
結果が単純な合計ではない場合、たとえばMapの構築、連結、要素間での状態の保持などに使用します。単純な合計または平均の場合は、代わりにsumとavgを使用します。名前が意味を表しているためです。
reduce_by(list, initial, accumulate)| パラメーター | 説明 |
|---|---|
| list | 畳み込むリスト。 |
| initial | accumulatorの開始値。 |
| accumulate | (accumulator, element)を受け取り、新しいaccumulatorを返すlambda。 |
リストを合計に畳み込む
次の例では、リストを実行中の合計に畳み込みます:
Formula
[1, 2, 3] >> reduce_by(0, (acc, n) ~> acc + n)出力
6ユースケース: SKU別に注文を合計
line itemは出荷ごとに1行で届くため、同じSKUが複数回表示されます。リスト関数を使用してそれらをグループ化し、それぞれの数量を合計します:
入力
{
"line_items": [
{"sku": "WID-1", "qty": 3},
{"sku": "GAD-7", "qty": 1},
{"sku": "WID-1", "qty": 2}
]
}Formula
_.line_items
>> group_by(li ~> li.sku)
>> entries
>> map_by(e ~> {key: e.key, value: e.value >> map_by(r ~> r.qty) >> sum})
>> from_entries出力
{"WID-1": 5, "GAD-7": 1}group_byはリストのMapを生成します。 entriesはそれを{key, value}ペアのリストに変換し、各グループを合計できるようにします。その後、from_entriesがそれを元に戻します。両方については、Map関数を参照してください。
リストの生成
次の関数は既存のリストを変換するのではなく、新しいリストを生成します:
range
startからendまでの整数のリストを、両端を含めて構築します。 startがendより大きい場合、リストは降順になります。
range(start, end)| パラメーター | 説明 |
|---|---|
| start | 最初の整数。含まれます。 |
| end | 最後の整数。含まれます。 |
昇順の範囲を構築
次の例では、整数の昇順の範囲を構築します:
Formula
range(1, 5)出力
[1, 2, 3, 4, 5]降順の範囲を構築
次の例では、startがendより大きい場合に降順の範囲を構築します:
Formula
range(5, 1)出力
[5, 4, 3, 2, 1]random_choice
ランダムに選択された1つの要素を返します。
結果は評価のたびに異なるため、後続ステップで再現が必要な用途には使用しないでください。繰り返す必要のない値を生成する他の方法については、Random関数を参照してください。
random_choice(list)| パラメーター | 説明 |
|---|---|
| list | 選択元のリスト。 |
関連情報
- Map関数:
group_byが返すMapを操作します。 - Deep map関数: 深くネストされた構造をたどります。
- 演算子: 演算子のpipelineファミリーに関する詳細情報。
- エラーコード:
E201、E204、E207などのジョブ失敗をトラブルシューティングします。
最終更新日: