Collection
Collectionクラスは コレクション 型の変数を扱います。
コレクションは次のように初期化します:
New collection {( ...value : any )} : Collection 空の、あるいは値の入った新規コレクションを作成し、その参照を返します |
New shared collection {( ...value : any )} : Collection 空の、あるいは値が入った新規コレクションを作成し、その参照を返します |
例題
var $colVar : Collection // コレクション型の 4D変数の宣言
$colVar:=New collection // コレクションの初期化と 4D変数への代入
概要
New collection
New collection {( ...value : any )} : Collection
引数 | 型 | 説明 | |
---|---|---|---|
value | Number, Text, Date, Time, Boolean, Object, Collection, Picture, Pointer | -> | コレクションの値 |
戻り値 | Collection | <- | 新規のコレクション |
説明
New collection
コマンドは、空の、あるいは値の入った新規コレクションを作成し、その参照を返します。
引数を渡さなかった場合、New collection
は空のコレクションを作成し、その参照を返します。
返された参照は、コレクション型の 4D変数に代入する必要があります。
var : Collection
やC_COLLECTION
ステートメン トはコレクション型の変数を宣言しますが、コレクション自体は作成しないという点に注意してください。
任意で、一つ以上の value 引数を渡すことで、あらかじめ値の入った新しいコレクションを作成することができます。
または、あとから代入によって要素を一つずつ追加・編集していくことができます。 例:
myCol[10]:="My new element"
コレクションの最終要素を超える要素番号 (インデックス) を指定した場合、コレクションは自動的にリサイズされ、合い間の要素にはすべて null 値が割り当てられらます。
サポートされている型 (数値、テキスト、日付、ピクチャー、ポインター、オブジェクト、コレクション等) であれば、個数に制限なく値を渡すことができます。 配列とは異なり、 コレクションでは異なる型のデータを混ぜることができます。
ただし以下の変換問題については注意する必要があります:
- 渡されたポインターは、そのまま保存されます。ポインターは
JSON Stringify
コマンドを使用することで評価されます。 - 日付は、"dates inside objects" データベース設定に応じて、"yyyy-mm-dd" という日付、または "YYYY-MM-DDTHH:mm:ss.SSSZ" というフォーマットの文字列で保存されます。 コレクションに保存する前に 4D日付をテキストに変換した場合、プログラムはデフォルトでローカルのタイムゾーンを使用します。 このふるまいは
SET DATABASE PARAMETER
コマンドでDates inside objects
セレクターを使用することで変更可能です。 - 時間を渡した場合、それはミリ秒の数 (実数) として保存されます。
例題 1
新しい空のコレクションを作成し、それを 4Dコレクション変数に代入します:
var $myCol : Collection
$myCol:=New collection
// $myCol=[]
例題 2
あらかじめ値の入ったコレクションを作成します:
var $filledColl : Collection
$filledColl:=New collection(33;"mike";"november";->myPtr;Current date)
// $filledColl=[33,"mike","november","->myPtr","2017-03-28T22:00:00.000Z"]
例題 3
新しいコレクションを作成し、そこに新しい要素を追加します:
var $coll : Collection
$coll:=New collection("a";"b";"c")
// $coll=["a","b","c"]
$coll[9]:="z" // 値 "z" を10番目の要素として追加します
$vcolSize:=$coll.length // 10
// $coll=["a","b","c",null,null,null,null,null,null,"z"]
New shared collection
履歴
リリース | 内容 |
---|---|
v16 R6 | 追加 |
New shared collection {( ...value : any )} : Collection
引数 | 型 | 説明 | |
---|---|---|---|
value | Number, Text, Date, Time, Boolean, Shared object, Shared collection | -> | 共有コレクションの値 |
戻り値 | Collection | <- | 新規の共有コレクション |
説明
New shared collection
コマンドは、空の、あるいは値が入った新規コレクションを作成し、その参照を返します。
このコレクションに要素を追加する場合には Use...End use 構造でくくる必要があり、そうしない場合にはエラーが返されます。ただし、push()
や map()
などの関数を使用して要素を追加する場合は、自動で内部的に Use...End use が使用されるため、必要ありません。 ただし、属性の読み取りは Use...End use
構造の外側でも可能です。
共有コレクションについての詳細は、共有オブジェクトと共有コレクション のページを参照してください。
引数を渡さない場合、New shared collection
は空のコレクションを作成し、その参照を返します。
返された参照は、コレクション型の 4D変数に代入する必要があります。
var : Collection
やC_COLLECTION
ステートメントはコレクション型の変数を宣言しますが、コレクション自体は作成しないという点に注意してください。
任意で、一つ以上の value 引数を渡すことで、あらかじめ値の入った新しい共有コレクションを作成することができます。 または、あとからオブジェクト記法による代入で要素を一つずつ追加・編集していくことができます (例題参照)。
共有コレクションの最終要素を超える要素番号 (インデックス) を指定した場合、共有コレクションは自動的にリサイズされ、合い間の要素にはすべて null 値が割り当てられらます。
以下のサポートされる型であれば、いくつでも値を渡すことができます:
- 数値 (実数、倍長整数...)。 数値は常に実数として保存されます。
- テキスト
- ブール
- 日付
- 時間 (ミリ秒の数 (実数) として保存されます)。
- null
- 共有オブジェクト
- 共有コレクション
標準のコレクション (非共有コレクション) とは異なり、共有コレクションはピクチャーやポインター、共有でないオブジェクトおよびコレクションはサポートしていません。
例題
$mySharedCol:=New shared collection("alpha";"omega")
Use($mySharedCol)
$mySharedCol[1]:="beta"
End use
.at()
履歴
リリース | 内容 |
---|---|
20 | 追加 |
.at( index : Integer ) : any
引数 | 型 | 説明 | |
---|---|---|---|
index | Integer | -> | 取得する要素のインデックス |
戻り値 | any | <- | そのインデックスにある要素 |
説明
.at()
関数は、index の位置にある要素を返します (index は正負の整数)。
このコマンドは、元のコレクションを変更しません。
負の整数が渡された場合、コレクションの最後の要素から逆向きに数えます。
index がコレクションの範囲を超える場合、この関数は Undefined を返します。
例題
var $col : Collection
$col:=New collection(10; 20; 30; 40; 50)
$element:=$col.at(0) // 10
$element:=$col.at(1) // 20
$element:=$col.at(-1) // 50
$element:=$col.at(-2) // 40
$element:=$col.at(10) // undefined
.average()
履歴
リリース | 内容 |
---|---|
v16 R6 | 追加 |
.average( {propertyPath : Text } ) : Real
引数 | 型 | 説明 | |
---|---|---|---|
propertyPath | Text | -> | 計算に使用するオブジェクトプロパティのパス |
戻り値 | Real, Undefined | <- | コレクションの値の算術平均 |
説明
.average()
関数は、コレクションインスタンス内で定義されている値の算術平均を返します。
計算の対象となるのは数値のみです (他の型の要素は無視されます)。
コレクションがオブジェクトを格納している場合には、計算するオブジェクトプロパティのパスを propertyPath に渡します。
.average()
は以下の場合には undefined
を返します:
- コレクションが空の場合
- コレクションに数値が含まれていない場合
- propertyPath 引数で指定したパスがコレクション内で見つからない場合
例題 1
var $col : Collection
$col:=New collection(10;20;"Monday";True;6)
$vAvg:=$col.average() //12
例題 2
var $col : Collection
$col:=New collection
$col.push(New object("name";"Smith";"salary";10000))
$col.push(New object("name";"Wesson";"salary";50000))
$col.push(New object("name";"Gross";"salary";10500))
$vAvg:=$col.average("salary") //23500
.clear()
履歴
リリース | 内容 |
---|---|
v16 R6 | 追加 |
.clear() : Collection
引数 | 型 | 説明 | |
---|---|---|---|
戻り値 | Collection | <- | 全要素が削除された元のコレクション |
説明
.clear()
関数は、コレクションインスタンス内の全要素を削除し、空のコレクションを返し ます。
このコマンドは、元のコレクションを変更します。
例題
var $col : Collection
$col:=New collection(1;2;5)
$col.clear()
$vSize:=$col.length //$vSize=0
.combine()
履歴
リリース | 内容 |
---|---|
v16 R6 | 追加 |
.combine( col2 : Collection {; index : Integer } ) : Collection
引数 | 型 | 説明 | |
---|---|---|---|
col2 | Collection | -> | 追加するコレクション |
index | Integer | -> | 追加要素を挿入する位置 (デフォルトは length+1) |
戻り値 | Collection | <- | 追加要素を格納した元のコレクション |
説明
.combine()
関数は、コレクションインスタンスの最後、あるいは index で指定した位置に col2 の要素を挿入し、変更された元のコレクションを返します。 .insert()
関数とは異なり、.combine()
は col2 の各要素を元のコレクション追加します (col2 自体が単一のコレクション要素としては挿入されるわけではありません)。
このコマンドは、元のコレクションを変更します。
デフォルトでは、col2 の要素は元のコレクションの最後に追加されます。 index に引数を渡すことで、col2 の要素を挿入する位置を指定することができます。
警告: コレクション要素は 0 起点である点に注意してください。
- 指定した index がコレクションの length より大きい場合、実際の開始インデックスはコレクションの length に設定されます。
- index < 0 の場合、index:=index+length として再計算されます (コレクションの終端からのオフセットであるとみなされます)。
- 計算結果も負の値である場合、index は 0 に設定されます。
例題
var $c; $fruits : Collection
$c:=New collection(1;2;3;4;5;6)
$fruits:=New collection("Orange";"Banana";"Apple";"Grape")
$c.combine($fruits;3) //[1,2,3,"Orange","Banana","Apple","Grape",4,5,6]
.concat()
履歴
リリース | 内容 |
---|---|
v16 R6 | 追加 |
.concat( value : any { ;...valueN } ) : Collection
引数 | 型 | 説明 | |
---|---|---|---|
value | Number, Text, Object, Collection, Date, Time, Boolean, Picture | -> | 連結する値。 value がコレクションの場合、コレクションの全要素が元のコレクションに追加されます。 |
戻り値 | Collection | <- | 元のコレクションに値が追加された新規コレクション |
説明
.concat()
関数は、value に指定した要素を元のコレクションの最後に追加した、新しいコレクションを返します。
このコマンドは、元のコレクションを変更しません。
value がコレクションの場合、その全要素が新しい要素として元のコレクションの最後に追加されます。 value がコレクションでない場合、それ自体が新しい要素として追加されます。
例題
var $c : Collection
$c:=New collection(1;2;3;4;5)
$fruits:=New collection("Orange";"Banana";"Apple";"Grape")
$fruits.push(New object("Intruder";"Tomato"))
$c2:=$c.concat($fruits) //[1,2,3,4,5,"Orange","Banana","Apple","Grape",{"Intruder":"Tomato"}]
$c2:=$c.concat(6;7;8) //[1,2,3,4,5,6,7,8]
.copy()
履歴
リリース | 内容 |
---|---|
18 R3 | ck shared オプションの追加。 groupWith パラメーターを追加。 |
v16 R6 | 追加 |
.copy() : Collection
.copy( option : Integer ) : Collection
.copy( option : Integer ; groupWithCol : Collection ) : Collection
.copy( option : Integer ; groupWithObj : Object ) : Collection
引数 | 型 | 説明 | |
---|---|---|---|
option | Integer | -> | ck resolve pointers : コピー前にポインターを解決するck shared : 共有コレクションを返す |
groupWithCol | Collection | -> | 結果のコレクションとグループする共有コレクション |
groupWithObj | Object | -> | 結果のコレクションとグループする共有オブジェクト |
戻り値 | Collection | <- | 元のコレクションのディープ・コピー |
説明
.copy()
関数は、 コレクションインスタンスのディープ・コピーを返します。ディープ・コピー とは、元のコレクション内のオブジェクトやコレクションは複製されることを意味し、返されたコレクションと元のコレクションは参照を共有しないということを意味します。
このコマンドは、元のコレクションを変更しません。
任意の option パラメーターには、以下のどちらか (あるいは両方) の定数を渡すことができます:
option | 説明 |
---|---|
ck resolve pointers | オリジナルのコレクションがポインター型の値を格納している場合、デフォルトではコピー先のオブジェクトもポインターを格納します。 しかしながら、ck resolve pointers 定数を渡すことで、コピー時にポインターを解決することができます。 この場合、コレクション内の各ポインターはコピー時に解決され、解決済みの値が使用されます。 |
ck shared | 共有コレクションに対して適用された場合でも、copy() はデフォルトで通常の (非共有の) コレクションを返します。 共有コレクション を作成するには、ck shared 定数を渡します。 この場合には、groupWith パラメーターに引数を渡して他の共有オブジェクトまたは共有コレクションに関連づけることもできます (以下参照)。 |
groupWithCol または groupWithObj 引数を渡すと、結果のコレクションを関連づけるコレクションまたはオブジェクトを指定できます。
データストア、データクラス、およびエンティティオブジェクトはコピーできません。 これらを対象に .copy()
を呼び出すと、Null
値が返されます。
例題 1
通常の (非共有の) コレクション $lastnames * を、共有オブジェクト $sharedObject 内にコピーします。 このためには、まず共有コレクション ($sharedLastnames*) を作成する必要があります。
var $sharedObject : Object
var $lastnames;$sharedLastnames : Collection
var $text : Text
$sharedObject:=New shared object
$text:=Document to text(Get 4D folder(Current resources folder)+"lastnames.txt")
$lastnames:=JSON Parse($text) // $lastnames は通常のコレクションです
$sharedLastnames:=$lastnames.copy(ck shared) // $sharedLastnames は共有コレクションです
// $sharedLastnames は $sharedObject の中に入れられます
Use($sharedObject)
$sharedObject.lastnames:=$sharedLastnames
End use
例題 2
どちらも共有コレクションである $sharedColl1 と*$sharedColl2* を結合します。 これらは異なる共有グループに所属しているため、直接結合した場合にはエラーが生成されます。 そこで、 $sharedColl1 のコピーを作成し、$sharedColl2 をそのコピーの共有グループ先に指定します。
var $sharedColl1;$sharedColl2;$copyColl : Collection
$sharedColl1:=New shared collection(New shared object("lastname";"Smith"))
$sharedColl2:=New shared collection(New shared object("lastname";"Brown"))
// $copyColl を $sharedColl2 と同じ共有グループに所属させます
$copyColl:=$sharedColl1.copy(ck shared;$sharedColl2)
Use($sharedColl2)
$sharedColl2.combine($copyColl)
End use
例題 3
通常のコレクション ($lastnames) があり、それをアプリケーションの Storage に入れます。 これには、先に共有コレクション ($sharedLastnames) を作成しておく必要があります。
var $lastnames;$sharedLastnames : Collection
var $text : Text
$text:=Document to text(Get 4D folder(Current resources folder)+"lastnames.txt")
$lastnames:=JSON Parse($text) // $lastnames は通常の (非共有) コレクションです
$sharedLastnames:=$lastnames.copy(ck shared) // 共有コピー
Use(Storage)
Storage.lastnames:=$sharedLastnames
End use
例題 4
ck resolve pointers
オプションを使用した場合のふるまいです:
var $col : Collection
var $p : Pointer
$p:=->$what
$col:=New collection
$col.push(New object("alpha";"Hello";"num";1))
$col.push(New object("beta";"You";"what";$p))
$col2:=$col.copy()
$col2[1].beta:="World!"
ALERT($col[0].alpha+" "+$col2[1].beta) // "Hello world!" を表示します
$what:="You!"
$col3:=$col2.copy(ck resolve pointers)
ALERT($col3[0].alpha+" "+$col3[1].what) // "Hello world!" を表示します