コレクションのクラス関数は、4D v16 R6 で導入され、map() や reduce() のように、いくつかの関数はフォーミュラを扱えるように進化しました。4D v20 では、同様に実用的な機能がいくつか追加されていますので、ここで紹介します。
first() と last()
関数 first() と last() はその名の通り、コレクションの 先頭 と 最後 の要素へのアクセスを提供します。インデックスと大カッコを使用する記法 (col[0]、col[col.length-1]) と異なり、コレクションが空でもエラーは生成されません。この場合、関数は単純に値 undefined を返します。
$first:=MyCollection.first()
$last:=MyCollection.last()
AT()
at() 関数は、大カッコ記法 (col[x]) の代わりにもなり、その利点は、負の値を指定することで末尾から要素を取得できることです。
first() や last() 関数と同様に、コレクションが空の場合やインデックスが範囲外の場合には、未定義 の値が (エラーなしで) 返されます。
$first:=MyCollection.at(0)
$second:=MyCollection.at(1)
$third:=MyCollection.at(2) // コレクションが 2要素しか格納していない場合には undefined
$last:=MyCollection.at(-1)
朗報です: この at() 関数は、エンティティセレクションでも利用可能です!
唯一の違いは、エンティティセレクションが空の場合 (またはインデックスが範囲外の場合)、関数は undefined ではなく Null を返します。
$es:=ds.Info.all()
$title1:=$es.at(0).title
$title2:=$es.at(1).title
$title3:=$es.at(2).title
Flat()
flat() 関数は、より革新的で、場合によっては非常に便利です。これは、コレクションを格納するコレクション (ネストされたコレクション) を平坦化することができます。
デフォルトでは、元のコレクションの階層は 1 減らされます。そのため、結果にはいくつかのサブコレクションが残る可能性があります。しかし、この関数はこれを補うための引数を受け付けます。
$flatCollection:=$nestedCollection.flat() // 結果のコレクションは完全に平坦化されていないかもしれません
$flatCollection:=$nestedCollection.flat(MAXLONG) // コレクションのネストは完全に解除されます
結果 (適用前 → 適用後)
includes()
includes() 関数は、テキスト・数値・日付・オブジェクト参照やコレクション参照など、ほとんどすべての型の要素について、コレクションに格納されているかを調べることができます。
$result:=colorsCol.includes("blue")
$result:=valuesCol.includes(10)
$result:=objectsCol.includes(myObjectRef)
reduceRight()
reduce() 関数はコレクションを先頭から末尾へと走査して、文字列や数値など任意の型の 1つの値を結果として出力します。
reduceRight() 関数は、同じように計算しますが、コレクションを右から左に走査します (つまり、最後から始めます)。演算の種類によっては、結果はまったく異なるものになります。
reduceRight() は reverse().reduce() を最適化したものと同一とも言えます。
flatmap()
map() 関数は、(4D v16 R6以降) あるコレクションの中身に基づいて、新しいコレクションを作成することができます。flatMap() 関数により、1回の操作で map() に続いて flat() を実行することができます。
flatMap() は map().flat() を最適化したものと同一とも言えます。
まとめ
これらの新しい関数は、JavaScript にインスパイアされたものもあり、4D がすでに提供している多くのコレクション関数を補完しました。これらは、きっと開発に役立つことでしょう。
4Dフォーラムで、遠慮なく意見をお聞かせください!