リスト関数 ​

このページは機械翻訳により提供されています。翻訳内容と英語版に相違がある場合は、英語版が優先されます。

リスト関数は順序付きコレクションを操作します。ほとんどの連携作業はリスト作業です。 webhookはレコードの配列を配信し、APIは結果のページを返し、宛先システムは異なる形状、異なる順序、または単一の集計数値を想定します。

_ は、これらの例で式が受け取る入力です。詳細については、入力変数を参照してください。

機能の提供状況

WELは現在、一部のお客様にご利用いただけます。ご利用のワークスペースで利用可能かどうかを確認するには、Customer Success Representativeにお問い合わせください。

リスト関数の呼び出し ​

関数を直接呼び出すか、>>を使用して値をパイプします:

text
count(_.line_items)
_.line_items >> count

リスト関数は連鎖に適しており、パイプ形式により複数ステップの変換を読みやすくできます:

text
_.orders >> filter_by(o ~> o.status == 'open') >> map_by(o ~> o.id)

Lambda ​

多くのリスト関数は、~>で記述された小さなインライン関数であるlambdaを受け取ります:

text
_.orders >> filter_by(order ~> order.total > 100)

~>の前のパラメーターには任意の名前を選択できます。これは一度に1つの要素を参照します。 2つ以上のパラメーターは括弧(())で囲みます:

text
_.items >> map_with_index_by((item, index) ~> f"{index + 1}. {item.name}")

->と=>はラムダ矢印ではありません

WELでは、ラムダに~>のみを使用します。 x -> x * 2またはx => x * 2を記述すると、パースエラーが発生します。これは、他の言語に精通しているユーザーやAIに最もよくある誤りです。他の言語では、ラムダに->または=>を使用することがよくあります。 AIエージェントにWELを扱うために必要なコンテキストを提供するには、WELキットを参照してください。

リストの検査 ​

次の関数はリストを変更せずに読み取ります:

count ​

要素数を返します。

text
count(list)
パラメーター説明
list測定するリスト。
空でないリストの要素をカウント

次の例では、空でないリストの要素をカウントします:

Formula

text
count(['SO-1', 'SO-2', 'SO-3'])

出力

text
3
空のリストの要素をカウント

次の例では、空のリストの要素をカウントします:

Formula

text
count([])

出力

text
0

first ​

最初の要素を返します。リストが空の場合はnullを返します。

text
first(list)
パラメーター説明
list読み取り元のリスト。
リストの最初の要素を取得

次の例では、リストの最初の要素を取得します:

Formula

text
first(['pending', 'shipped'])

出力

text
保留中
空のリストには最初の要素がない

次の例では、空のリストに対してnullを返します:

Formula

text
first([])

出力

text
null

last ​

最後の要素を返します。リストが空の場合はnullを返します。

text
last(list)
パラメーター説明
list読み取り元のリスト。
リストの最後の要素を取得

次の例では、リストの最後の要素を取得します:

Formula

text
last(['pending', 'shipped'])

出力

text
shipped

at ​

ゼロベースのインデックスにある要素を返します。負のインデックスは末尾から逆に数えます。

リスト範囲外のインデックスはE201を発生させます。末尾または先頭だけが必要な場合は、firstまたはlastを使用します。位置ではなく要素を検索するには、find_byを使用します。

text
at(list, index)
パラメーター説明
list読み取り元のリスト。
インデックスゼロベースの位置。負の値は末尾から数えます。
正のインデックスにある要素を取得

次の例では、インデックス0にある要素を取得します:

Formula

text
at(['pending', 'shipped', 'closed'], 0)

出力

text
保留中
負のインデックスにある要素を取得

次の例では、負のインデックスを使用して最後の要素を取得します:

Formula

text
at(['pending', 'shipped', 'closed'], -1)

出力

text
closed

one! ​

1要素のリストの単一要素を返し、それ以外の長さの場合はE204を発生させます。

アサーションとして使用します。 one!は、lookupが正確に1件のレコードに一致する必要がある場合に、「ゼロまたは多数」を、誤ったレコードで静かに処理を続行する変換ではなく、明確に失敗するジョブに変えます。

text
one!(list)
パラメーター説明
list正確に1つの要素を保持することが想定されるリスト。
1要素のリストから単一要素を抽出

次の例では、1要素のリストから単一要素を抽出します:

Formula

text
one!(['SO-1001'])

出力

text
SO-1001

リストのテスト ​

次の関数は新しいリストを返すのではなく、リストに関する質問に答えます:

all? ​

すべての要素がpredicateを満たす場合にtrueを返します。空のリストはtrueを返します。

text
all?(list, predicate)
パラメーター説明
listテストするリスト。
predicate各要素に対してBooleanを返すlambda。
すべての要素がpredicateに一致するかをテスト

次の例では、すべての要素が'open'であるかをテストします:

Formula

text
['open', 'open'] >> all?(s ~> s == 'open')

出力

text
true

any? ​

少なくとも1つの要素がpredicateを満たす場合にtrueを返します。

text
any?(list, predicate)
パラメーター説明
listテストするリスト。
predicate各要素に対してBooleanを返すlambda。
いずれかの要素がしきい値を超えるかをテスト

次の例では、いずれかの要素が100より大きいかをテストします:

Formula

text
[199, 42, 8] >> any?(n ~> n > 100)

出力

text
true

find_by ​

predicateを満たす最初の要素を返します。該当するものがない場合はnullを返します。

text
find_by(list, predicate)
パラメーター説明
list検索するリスト。
predicate各要素に対してBooleanを返すlambda。
フィールド値でレコードを検索

次の例では、SKUが一致する最初のレコードを検索します:

Formula

text
[{id: 1, sku: 'WID-1'}, {id: 2, sku: 'GAD-7'}] >> find_by(r ~> r.sku == 'GAD-7')

出力

text
{id: 2, sku: "GAD-7"}

find_first_index ​

predicateを満たす最初の要素のゼロベースのインデックスを返します。該当するものがない場合は-1を返します。

text
find_first_index(list, predicate)
パラメーター説明
list検索するリスト。
predicate各要素に対してBooleanを返すlambda。
一致する要素のインデックスを検索

次の例では、'c'と等しい要素のインデックスを検索します:

Formula

text
['a', 'b', 'c'] >> find_first_index(s ~> s == 'c')

出力

text
2
predicateに一致する要素がない

次の例では、一致する要素がない場合に-1を返します:

Formula

text
['a', 'b'] >> find_first_index(s ~> s == 'z')

出力

text
-1

要素の選択 ​

次の関数は元のリストから構築された短いリストを返します:

filter_by ​

predicateがtrueを返す要素を保持します。

Mapも受け取ります。その場合、lambdaはkeyとvalueの2つのパラメーターを受け取ります。結果もMapです。

text
filter_by(list, predicate)
パラメーター説明
listフィルターするリストまたはmap。
predicateBooleanを返すlambda。
しきい値を超える値にリストをフィルター

次の例では、2より大きい要素のみを保持します:

Formula

text
[1, 2, 3, 4] >> filter_by(n ~> n > 2)

出力

text
[3, 4]

take ​

最初のcount個の要素を返します。countが負の場合は最後のcount個の要素を返します。リストが保持する数より多く要求すると、エラーを発生させるのではなくリスト全体を返します。

text
take(list, count)
パラメーター説明
list読み取り元のリスト。
count要素数。負の値は末尾から取得します。
先頭から要素を取得

次の例では、最初の2つの要素を取得します:

Formula

text
take(['a', 'b', 'c', 'd'], 2)

出力

text
["a", "b"]
末尾から要素を取得

次の例では、負のcountを使用して最後の2つの要素を取得します:

Formula

text
take(['a', 'b', 'c', 'd'], -2)

出力

text
["c", "d"]

drop ​

最初のcount個の要素を削除します。countが負の場合は最後のcount個の要素を削除します。

text
drop(list, count)
パラメーター説明
list読み取り元のリスト。
count削除する要素数。負の値は末尾から削除します。
先頭から要素を削除

次の例では、最初の2つの要素を削除します:

Formula

text
drop(['a', 'b', 'c', 'd'], 2)

出力

text
["c", "d"]

compact ​

nullとSkipの値を削除します。

一部の要素に対してのみ値を生成するmap_byの直後や、受信payloadから任意フィールドを取り除く場合に便利です。

text
compact(list)
パラメーター説明
listクリーンアップするリスト。
リストからnull値を削除

次の例では、リストからnull値を削除します:

Formula

text
compact(['a', null, 'b'])

出力

text
["a", "b"]

unique ​

重複を削除し、各値の最初の出現を元の位置に保持します。

text
unique(list)
パラメーター説明
list重複排除するリスト。
リストから重複値を削除

次の例では、最初の出現を保持しながら重複値を削除します:

Formula

text
unique(['WID-1', 'GAD-7', 'WID-1'])

出力

text
["WID-1", "GAD-7"]

unique_by ​

key関数で重複を削除し、各keyの最初の要素を保持します。

レコードで使用します。2つのエントリは、オブジェクト全体は異なっていても識別子を共有しているため「同じ」と見なされます。

text
unique_by(list, key)
パラメーター説明
list重複排除するリスト。
key比較に使用する値を返すlambda。
keyフィールドでレコードを重複排除

次の例では、各SKUの最初のレコードを保持します:

Formula

text
[{sku: 'WID-1'}, {sku: 'WID-1'}] >> unique_by(r ~> r.sku)

出力

text
[{sku: "WID-1"}]

ユースケース: webhookバッチから有効なレコードを保持 ​

webhookは、一部のレコードでメールアドレスが欠落し、1つの識別子が繰り返されるバッチを配信します。リスト関数を使用して、識別子ごとに1つのレコードを保持し、配信先のメールがないものを削除します:

入力

json
{
  "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

text
_.contacts
  >> unique_by(c ~> c.id)
  >> filter_by(c ~> present?(c.email))
  >> map_by(c ~> c.email)

出力

json
["nur@example.com", "dana@example.com"]

unique_byはfilter_byの前に実行されるため、重複はメールアドレスの有無ではなくIDに基づいて削除されます。

要素の変換 ​

次の関数は同じ長さのリストを返すか、構造を変形します:

map_by ​

すべての要素にlambdaを適用し、結果を返します。

lambdaがSkipを返す要素は省略されるため、map_byは同じパスでフィルターと変換を実行できます。

text
map_by(list, transform)
パラメーター説明
list変換するリスト。
transform各要素の新しい値を返すlambda。
リストの各要素を2倍にする

次の例では、リストの各要素を2倍にします:

Formula

text
[1, 2, 3] >> map_by(n ~> n * 2)

出力

text
[2, 4, 6]

map_with_index_by ​

要素とそのゼロベースのインデックスを受け取る2パラメーターのlambdaを適用します。

text
map_with_index_by(list, transform)
パラメーター説明
list変換するリスト。
transform(element, index)を受け取るlambda。
リストの各要素に番号を付ける

次の例では、インデックスを使用して各要素に番号を付けます:

Formula

text
['a', 'b'] >> map_with_index_by((s, i) ~> f"{i + 1}. {s}")

出力

text
["1. a", "2. b"]

flatten ​

ネストを1レベルだけフラット化します。 2階層深くネストされたリストでは内側のリストが保持されるため、さらに進むにはflattenを再度呼び出します。

text
flatten(list)
パラメーター説明
listフラット化するリストのリスト。
リストのリストをフラット化

次の例では、リストのリストを1レベルフラット化します:

Formula

text
flatten([[1, 2], [3]])

出力

text
[1, 2, 3]
Flattenはネストを1レベルだけ削除

次の例では、2レベル深くネストされたリストで内側のリストが保持されることを示します:

Formula

text
[[1, 2], [3, [4]]] >> flatten

出力

text
[1, 2, 3, [4]]

zip ​

2つのリストの要素を2要素リストにペア化します。短い方のリストが長さを決定します。

text
zip(first, second)
パラメーター説明
first最初のリスト。
second2番目のリスト。
同じ長さの2つのリストをペア化

次の例では、同じ長さの2つのリストをペア化します:

Formula

text
zip(['sku', 'qty'], ['WID-1', 3])

出力

text
[["sku", "WID-1"], ["qty", 3]]
短い方のリストが結果の長さを決定

次の例は、短い方のリストが結果の長さを決定することを示します:

Formula

text
zip(['a', 'b', 'c'], [1])

出力

text
[["a", 1]]

reverse ​

要素の順序を反転します。

text
reverse(list)
パラメーター説明
list反転するリスト。
リストの順序を反転

次の例では、リストの順序を反転します:

Formula

text
reverse(['a', 'b', 'c'])

出力

text
["c", "b", "a"]

リストの並べ替え ​

次の関数は、リストを昇順かつ安定的にソートします:

sort ​

昇順にソートします。ソートは安定しているため、比較で等しい要素は元の相対順序を保持します。

text
sort(list)
パラメーター説明
listソートするリスト。
リストを昇順にソート

次の例では、リストを昇順にソートします:

Formula

text
sort([3, 1, 2])

出力

text
[1, 2, 3]
sort後に反転して降順にソート

次の例では、昇順にソートしてから反転し、降順を取得します:

Formula

text
[3, 1, 2] >> sort >> reverse

出力

text
[3, 2, 1]

sort_by ​

key関数で昇順かつ安定的にソートします。

降順のバリアントはありません。降順にするには、結果をreverseにパイプします。

text
sort_by(list, key)
パラメーター説明
listソートするリスト。
keyソートに使用する値を返すlambda。
フィールドでレコードをソート

次の例では、レコードをnフィールドでソートします:

Formula

text
[{n: 'b'}, {n: 'a'}] >> sort_by(r ~> r.n)

出力

text
[{n: "a"}, {n: "b"}]

ユースケース: 上位3つの最大注文を取得 ​

レポートでは、バッチから抽出された上位3つの最大注文が必要です。昇順にソートし、反転してから先頭から取得します:

入力

json
{
  "orders": [
    {"id": "SO-1", "amount": 120},
    {"id": "SO-2", "amount": 940},
    {"id": "SO-3", "amount": 310},
    {"id": "SO-4", "amount": 75}
  ]
}

Formula

text
_.orders
  >> sort_by(o ~> o.amount)
  >> reverse
  >> take(3)
  >> map_by(o ~> o.id)

出力

json
["SO-2", "SO-3", "SO-1"]

グループ化と分割 ​

次の関数は、keyまたはpredicateに基づいてリストをグループまたは2つのバケットに分割します:

group_by ​

key関数の結果をkeyとするMapに要素をグループ化します。各値は、そのkeyを共有する要素のリストです。

text
group_by(list, key)
パラメーター説明
listグループ化するリスト。
keyグループ化keyを返すlambda。
keyフィールドでレコードをグループ化

次の例では、レコードをSKUでグループ化します:

Formula

text
[{sku: 'WID-1', q: 1}, {sku: 'GAD-7', q: 2}, {sku: 'WID-1', q: 5}] >> group_by(r ~> r.sku)

出力

text
{"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)で読み取ります。

text
partition_by(list, predicate)
パラメーター説明
list分割するリスト。
predicateBooleanを返すlambda。
predicateでリストを分割

次の例では、リストを一致する要素と一致しない要素に分割します:

Formula

text
[1, 2, 3, 4] >> partition_by(n ~> n > 2)

出力

text
[[3, 4], [1, 2]]
結果から一致する要素を読み取る

次の例では、分割された結果から一致する要素のみを読み取ります:

Formula

text
[1, 2, 3, 4] >> partition_by(n ~> n > 2) >> at(0)

出力

text
[3, 4]

ユースケース: バッチ結果を成功と失敗に分割 ​

bulk APIは、行ごとのステータスを持つレコードを行ごとに1件返します。 partition_byを使用してそれらを分割します。これにより、成功は続行し、失敗は再試行パスにルーティングできます:

入力

json
{
  "results": [
    {"id": "A", "status": "ok"},
    {"id": "B", "status": "error"},
    {"id": "C", "status": "ok"}
  ]
}

Formula

text
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)
}

出力

json
{"succeeded": ["A", "C"], "failed": ["B"]}

let … doは分割を1回だけバインドするため、リストは2回ではなく1回だけパーティション化されます。

集計 ​

次の関数はリストを1つの値に縮約します:

sum ​

数値要素を加算します。空のリストの合計は0です。

text
sum(list)
パラメーター説明
list数値のリスト。
floatのリストを合計

次の例では、floatのリストを合計します:

Formula

text
sum([12.50, 99.00])

出力

text
111.5
スケールを保持するためにdecimalのリストを合計

次の例では、Decimal値のリストを合計し、元のスケールを保持します:

Formula

text
sum([Decimal('12.50'), Decimal('99.00')])

出力

text
111.50
空のリストの合計はゼロ

次の例では、空のリストを合計します:

Formula

text
sum([])

出力

text
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を発生させます。何もないものの有意な平均は存在しないためです。

text
avg(list)
パラメーター説明
list数値のリスト。
数値のリストを平均

次の例では、数値のリストを平均します:

Formula

text
avg([10, 20, 30])

出力

text
20

min ​

最小の要素を返します。数値だけでなく文字列にも対応します。

text
min(list)
パラメーター説明
list縮約するリスト。
リスト内の最小の数値を検索

次の例では、リスト内の最小の数値を検索します:

Formula

text
min([5, 2, 9])

出力

text
2

max ​

最大の要素を返します。数値だけでなく文字列にも対応します。

text
max(list)
パラメーター説明
list縮約するリスト。
リスト内の最大の数値を検索

次の例では、リスト内の最大の数値を検索します:

Formula

text
max([5, 2, 9])

出力

text
9
リスト内の最大の文字列を検索

次の例では、リスト内の最大の文字列を検索します:

Formula

text
max(['apple', 'pear'])

出力

text
pear

reduce_by ​

accumulatorを使用してリストを単一の値に畳み込みます。

結果が単純な合計ではない場合、たとえばMapの構築、連結、要素間での状態の保持などに使用します。単純な合計または平均の場合は、代わりにsumとavgを使用します。名前が意味を表しているためです。

text
reduce_by(list, initial, accumulate)
パラメーター説明
list畳み込むリスト。
initialaccumulatorの開始値。
accumulate(accumulator, element)を受け取り、新しいaccumulatorを返すlambda。
リストを合計に畳み込む

次の例では、リストを実行中の合計に畳み込みます:

Formula

text
[1, 2, 3] >> reduce_by(0, (acc, n) ~> acc + n)

出力

text
6

ユースケース: SKU別に注文を合計 ​

line itemは出荷ごとに1行で届くため、同じSKUが複数回表示されます。リスト関数を使用してそれらをグループ化し、それぞれの数量を合計します:

入力

json
{
  "line_items": [
    {"sku": "WID-1", "qty": 3},
    {"sku": "GAD-7", "qty": 1},
    {"sku": "WID-1", "qty": 2}
  ]
}

Formula

text
_.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

出力

json
{"WID-1": 5, "GAD-7": 1}

group_byはリストのMapを生成します。 entriesはそれを{key, value}ペアのリストに変換し、各グループを合計できるようにします。その後、from_entriesがそれを元に戻します。両方については、Map関数を参照してください。

リストの生成 ​

次の関数は既存のリストを変換するのではなく、新しいリストを生成します:

range ​

startからendまでの整数のリストを、両端を含めて構築します。 startがendより大きい場合、リストは降順になります。

text
range(start, end)
パラメーター説明
start最初の整数。含まれます。
end最後の整数。含まれます。
昇順の範囲を構築

次の例では、整数の昇順の範囲を構築します:

Formula

text
range(1, 5)

出力

text
[1, 2, 3, 4, 5]
降順の範囲を構築

次の例では、startがendより大きい場合に降順の範囲を構築します:

Formula

text
range(5, 1)

出力

text
[5, 4, 3, 2, 1]

random_choice ​

ランダムに選択された1つの要素を返します。

結果は評価のたびに異なるため、後続ステップで再現が必要な用途には使用しないでください。繰り返す必要のない値を生成する他の方法については、Random関数を参照してください。

text
random_choice(list)
パラメーター説明
list選択元のリスト。
  • Map関数: group_byが返すMapを操作します。
  • Deep map関数: 深くネストされた構造をたどります。
  • 演算子: 演算子のpipelineファミリーに関する詳細情報。
  • エラーコード: E201、E204、E207などのジョブ失敗をトラブルシューティングします。

最終更新日: