Nouvelles fonctions pratiques pour les collections !

Traduit automatiquement de Deepl

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.

Exemple de base de données

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 !

 

Roland Lannuzel
- Product Owner & 4D Expert - Après avoir étudié l'électronique, Roland s'est lancé dans l'informatique industrielle en tant que développeur et consultant, créant des solutions pour les clients avec une variété de bases de données et de technologies. À la fin des années 80, il est tombé amoureux de 4D et l'a utilisé pour écrire des applications commerciales, notamment des systèmes de comptabilité, de facturation et de messagerie électronique. Il a rejoint la société en 1997 et a contribué à la conception de spécifications, d'outils de test et de démonstrations, ainsi qu'à la formation et à la présentation de la communauté 4D lors de nombreuses conférences. Il continue à façonner activement l'avenir de 4D en définissant de nouvelles fonctionnalités et des outils de développement de bases de données.