J'écris une fonction récursive sur un arborescence JSON Je connais la difficulté suivante:
Disons que je veux retirer le type B sur l'arborescence suivante: P> {nom, type, [enfants]} code> pour supprimer des nœuds d'un certain type. Cependant, les enfants du nœud supprimé doivent être rétablis au parent, s'ils ne sont pas du type à retirer.
const removeType = (node, type) => {
//if the node should not be removed
if (node.type !== type){
//if the node has children, recursively call to prune children
if (node.children && node.children.length > 0){
node.children = [...node.children.map(child => removeType(child, type))
.filter(child => child !== null)]
return node
}
//if the node has no children, return the node
else return node
}
//if the node should be removed
else if (node.type === type){
//if the node has children, recursively call, then reattach the children
if (node.children && node.children.length > 0){
node.children = [...node.children.map(child => removeType(child, type))
.filter(child => child !== null)]
return node.children
}
//
else return null
}
}
3 Réponses :
mis à jour strong> Je pense que vous pouvez utiliser réduire pour cela, je n'ai pas mon ordinateur en ce moment pour le tester, mais ce sera quelque chose comme ça P> const removeType = (node, type) => {
if (!node) return;
return node.reduce((acc, child) => {
if(child["type"] === type) {
const removedChild = removeType(child["children"], type);
acc = [...acc, ...removedChild];
} else {
child.children = removeType(child["children"], type);
acc.push(child);
}
return acc;
}, []);
}
Ce retour [enfant, [petit-enfant, petit-enfant], coeur] code> a toujours le tableau imbriqué.
Merci beaucoup! J'aurais dû penser à utiliser réduire lol.
Voici un moyen de simplifier le programme à l'aide de p> array.pototype.fraTmap code>, d'une induction mathématique et d'une touche de récursivité mutuelle -
RemoveType code> Accepte un em> de em> de
de noeuds code> et d'un type de requête à supprimer,
q code> li> li>
removeType1 code> Accepte un Single em>
Node code> et un type de requête pour supprimer,
q code> li>
ul>
[
{
"name": "parent",
"type": "a",
"children": [
{
"name": "childA",
"type": "a",
"children": null
},
{
"name": "grandChildA",
"type": "a",
"children": null
},
{
"name": "grandChildB",
"type": "a",
"children": null
},
{
"name": "childC",
"type": "a",
"children": null
}
]
}
]
Merci d'avoir répondu! C'est très utile!
Je pense que cette réponse est juste assez différente des autres fournies pour l'ajouter comme alternative. Il a la même structure récursive que la réponse de Merci, mais elle simplifie l'hypothèse que votre entrée est toujours une matrice, de même que tous les enfants code> enfants code> les nœuds p>
.as-console-wrapper {min-height: 100% !important; top: 0}