JSFiddle - React, Tailwind, and code Playground
HTML
<code id="console"></code>
CSS
code {
display: block;
white-space: pre-wrap
}
JavaScript
const data = [
'E',
'HB',
'AFC',
'G',
'D'
]
// Classe servant à modéliser un "Node".
// Contient un niveau (la position de ligne dans la liste ci-dessus),
// une valeur (la lettre),
// et des enfants (les autres nodes de valeur inférieure)
// Je l'ai appelé "Node", mais on peut l'appeler n'importe comment.
// "Node" n'a pas de signification particulière en JS
// Si la classe "Node" existe déjà en VB.net, alors il faut lui donner un autre nom
// Conceptuellement, c'est +- la même chose que des dossiers qui contiennent des sous-dossiers etc.
class Node {
// Constructeur d'instance. Appelé quand tu fais new Node()
// level > numéro de la ligne du tablea 'data' ci-dessus (on compte à partir de 0)
// value > la lettre correspondante
// par exemple : new Node(2, "F")
constructor(level, value) {
// Les différents attributs d'un node
this.level = level // integer
this.value = value // string
this.children = [] // C#: List<Node>
}
// Cherche et sauve tous les éléments inférieurs à l'instance de Node actuelle (this)
setChildren() {
// On s'assure que la liste est vide
this.children = []
// Pour chaque element (child) de la liste de nodes
for (let child of nodes) {
// Si le niveau de child < niveau de this (l'instance courante),
// alors c'est un enfant
if (child.level > this.level) {
this.children.push(child)
}
}
}
// Convertit les children récursifs en une liste plate
flatten(str, list) {
// On ajoute la valeur courante à la chaine
str += this.value
// Si la chaine fait 4 lettres, on l'ajoute à la liste
if (str.length === 4) {
list.push(str)
}
// On rappelle flatten pour les enfants,
// ce qui fait grandir la variable `str` pour chaque branche de l'arbre
for (let child of this.children) {
child.flatten(str, list)
}
}
}
// Liste des instances de Nodes
// [] est un tableau redimensionnable
// en C#, ce sera "var...