Les fonctions associées aux collections ont été introduites avec 4D v16 R6 et ont évolué avec la possibilité d’utiliser des formules pour certaines d’entre elles, comme map() ou reduce(). 4D v20 apporte d’autres fonctionnalités tout aussi pratiques, que nous allons présenter ici.
First() et last()
Les deux fonctions , first() et last() permettent, comme leur nom l’indique, d’accéder au premier et au dernier élément d’une collection. Contrairement à l’utilisation d’indices et de parenthèses (col[0], col[col.length-1]), il n’y a pas de risque d’erreur si la collection est vide. Dans ce cas, la valeur undefined sera simplement retournée par ces fonctions.
$first:=MyCollection.first()
$last:=MyCollection.last()
AT()
La fonction at() est également une alternative aux crochets (col[x]) avec un avantage : la valeur peut être négative pour obtenir les éléments à partir de la fin.
Comme les fonctions first() et last(), la valeur undefined sera renvoyée (sans erreur) en cas de collection vide ou de dépassement d’index.
$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)
Bonne nouvelle: La fonction at() est également disponible pour les entity selections!
La seule différence est que la fonction renvoie Null au lieu de undefined lorsque l’ entity selection est vide (ou en cas de dépassement d’index).
$es:=ds.Info.all()
$title1:=$es.at(0).title
$title2:=$es.at(1).title
$title3:=$es.at(2).title
Flat()
La fonction flat() est plus innovante et sera très utile dans certains cas. Elle permet d’aplatir des collections qui peuvent contenir des collections (qui peuvent elle-mêmes inclure des collections, etc.).
Par défaut, le nombre de niveaux de la collection d’origine est réduit d’une unité. Certaines collections peuvent donc subsister dans le résultat. Mais la fonction accepte un paramètre pour compenser cela.
$flatCollection:=$nestedCollection.flat() // might still contain collections
$flatCollection:=$nestedCollection.flat(MAXLONG) // all included collections will be flatten
Résultat (avant / après)
includes()
La fonction includes() est pratique car elle permet de savoir si une collection contient tel ou tel élément de presque n’importe quel type… texte, numérique, date… et même des références d’objets ou de collections.
$result:=colorsCol.includes("blue")
$result:=valuesCol.includes(10)
$result:=objectsCol.includes(myObjectRef)
reduceRight()
Vous connaissez déjà la fonction reduce(), qui permet d’itérer automatiquement sur une collection pour obtenir un résultat unique de n’importe quel type : Une chaîne de caractères, une valeur numérique…
Cette fonction permet le même type de calculs mais balaye la collection de droite à gauche (c’est-à-dire en commençant par la fin). Selon le type d’opération, les résultats peuvent être très différents.
En résumé, reduceRight() est l’équivalent optimisé de reverse().reduce()
flatmap()
La fonction map() permet (depuis la version 4Dv16 R6) de créer une collection basée sur le contenu d’une autre collection. La fonction flatMap() permet d’effectuer, en une seule opération, un map() suivie d’une flat() – une fonction que nous avons déjà mentionnée.
Elle est donc l’équivalent optimisé de la fonction map().flat()
Conclusion
Ces nouvelles fonctions, dont certaines sont inspirées du langage JavaScript, viennent compléter les fonctions de collection déjà présentes dans 4D. Elles seront déterminantes dans votre développement.
N’hésitez pas à en parler sur le forum 4D !