As funções associadas às colecções foram introduzidas com 4D v16 R6 e evoluíram com a possibilidade de utilizar fórmulas para algumas delas, como map() ou reduce(). 4D v20 traz outras características igualmente práticas, que apresentaremos aqui.
First() et last()
As duas funções, first() e last(), como os seus nomes indicam, permitem o acesso ao primeiro e ao último elemento de uma colecção. Ao contrário da utilização de índices e parênteses (col[0], col[col.length-1]), não há risco de erro se a colecção estiver vazia. Neste caso, o valor undefined será simplesmente devolvido pelas funções.
$first:=MyCollection.first()
$last:=MyCollection.last()
AT()
O at() é também uma alternativa aos parênteses rectos (col[x]) com um benefício; o valor pode ser negativo para obter os itens a partir do fim.
Tal como as funções first() e last(), o valor indefinido será devolvido (sem erro) no caso de uma colecção vazia ou transbordo de índice.
$first:=MyCollection.at(0)
$second:=MyCollection.at(1)
$third:=MyCollection.at(2) // might be undefined if collection contains only two items
$last:=MyCollection.at(-1)
Boas notícias: O at() também está disponível para a selecção de entidades!
A única diferença é que a função retorna Nula em vez de indefinida quando a selecção da entidade está vazia (ou em caso de transbordo de índice).
$es:=ds.Info.all()
$title1:=$es.at(0).title
$title2:=$es.at(1).title
$title3:=$es.at(2).title
Flat()
O flat() é mais inovadora e será muito útil em alguns casos. Permite a aplanação de colecções que podem conter colecções (que também podem incluir colecções, etc.).
Por defeito, o número de níveis da colecção original é reduzido em um. Assim, algumas colecções podem permanecer no resultado. Mas a função aceita um parâmetro para compensar este facto.
$flatCollection:=$nestedCollection.flat() // might still contain collections
$flatCollection:=$nestedCollection.flat(MAXLONG) // all included collections will be flatten
Resultado (Antes / Depois)
incluDES()
O includes() é útil porque permite saber se uma colecção contém este ou aquele elemento de quase qualquer tipo… texto, numérico, data… e até referências de objectos ou colecções.
$result:=colorsCol.includes("blue")
$result:=valuesCol.includes(10)
$result:=objectsCol.includes(myObjectRef)
reduceRight()
Já conhece a função reduzir(), que lhe permite iterar automaticamente numa colecção para obter um resultado único de qualquer tipo: Uma cadeia, um valor numérico…
Esta função permite o mesmo estilo de cálculos mas digitaliza a colecção da direita para a esquerda (ou seja, começando pelo fim). Consoante o tipo de operação, os resultados podem ser bastante diferentes.
Em resumo, reduceRight() é o equivalente optimizado de reverse().reduce()
flatmap()
O map() permite (desde a versão 4Dv16 R6) criar uma colecção com base no conteúdo de outra colecção. O flatMap() permite-nos realizar, numa única operação, uma map() seguido de um flat() – uma função que mencionámos anteriormente.
É, portanto, o equivalente optimizado da função map().flat()
Conclusão
Estas novas funções, algumas das quais inspiradas pelo JavaScript, completam as grandes funções da colecção já presentes no 4D. Elas serão fundamentais para o seu desenvolvimento.
Não hesite em falar sobre isso no fórum 4D!