J'ai un tableau imbriqué d'objets comme celui-ci:

let data = [
  {
      id: 1,
      title: "Abc",
      children: [
          {
              id: 2,
              title: "Type 2",
              children: [
                  {
                      id: 23,
                      title: "Number 3",
                      children:[] /* This key needs to be deleted */
                  }
              ]
          },
      ]
  },
  {
      id: 167,
      title: "Cde",
      children:[] /* This key needs to be deleted */
  }
] 

Tout ce que je veux, c'est trouver récursivement leaves sans enfants (actuellement un tableau vide) et supprimer la propriété children d'eux.

Voici mon code:

normalizeData(data, arr = []) {
    return data.map((x) => {
        if (Array.isArray(x))
            return this.normalizeData(x, arr)
        return {
            ...x,
            title: x.name,
            children: x.children.length ? [...x.children] : null
        }
    })
}
2
Amir Shahbabaie 26 janv. 2019 à 17:09

4 réponses

Meilleure réponse

Vous devez utiliser la récursivité pour cela:

let data = [{
    id: 1,
    title: "Abc",
    children: [{
      id: 2,
      title: "Type 2",
      children: [{
        id: 23,
        title: "Number 3",
        children: [] /* This key needs to be deleted */
      }]
    }]
  },
  {
    id: 167,
    title: "Cde",
    children: [] /* This key needs to be deleted */
  }
]

function traverse(obj) {
  for (const k in obj) {
    if (typeof obj[k] == 'object' && obj[k] !== null) {
      if (k === 'children' && !obj[k].length) {
        delete obj[k]
      } else {
        traverse(obj[k])              
      }
    }
  }
}

traverse(data)
console.log(data)
4
Nik Kyriakides 26 janv. 2019 à 14:14

Une simple récursivité avec forEach suffit.

let data = [{
    id: 1,
    title: "Abc",
    children: [{
      id: 2,
      title: "Type 2",
      children: [{
        id: 23,
        title: "Number 3",
        children: [] /* This key needs to be deleted */
      }]
    }, ]
  },
  {
    id: 167,
    title: "Cde",
    children: [] /* This key needs to be deleted */
  }
]

const cleanUp = data =>
  data.forEach(n =>
    n.children.length
      ? cleanUp(n.children)
      : (delete n.children))
      
      
cleanUp(data)
console.log(data)

Cela suppose que les enfants sont là. S'il peut être manquant, il suffit de modifier légèrement le chèque pour qu'il ne fasse pas d'erreur sur le contrôle de la longueur. n.children && n.children.length

2
epascarello 26 janv. 2019 à 14:41

Vous pouvez le faire comme ceci en utilisant la récursivité.

Donc, ici, l'idée de base est dans la fonction removeEmptyChild, nous vérifions si la longueur des enfants est non nulle ou non. Donc, si c'est le cas, nous parcourons chaque élément du tableau des enfants et les transmettons à nouveau comme paramètre, si la longueur des enfants est nulle, nous supprimons la clé des enfants.

let data=[{id:1,title:"Abc",children:[{id:2,title:"Type2",children:[{id:23,title:"Number3",children:[]}]},]},{id:167,title:"Cde",children:[]},{id:1}]

function removeEmptyChild(input){
  if( input.children && input.children.length ){
    input.children.forEach(e => removeEmptyChild(e) )
  } else {
    delete input.children
  }
  return input
}

data.forEach(e=> removeEmptyChild(e))

console.log(data)
2
Code Maniac 26 janv. 2019 à 14:50

La réponse de Nik est très bien (même si je ne vois pas l'intérêt d'accéder à la clé children comme ça), mais voici une alternative plus courte si cela peut aider:

let data = [
  {id: 1, title: "Abc", children: [
    {id: 2, title: "Type 2", children: [
      {id: 23, title: "Number 3", children: []}
    ]}
  ]},
  {id: 167, title: "Cde", children: []}
];

data.forEach(deleteEmptyChildren = o => 
  o.children.length ? o.children.forEach(deleteEmptyChildren) : delete o.children);

console.log(data);

Si children n'est pas toujours là, vous pouvez remplacer la partie principale du code par:

data.forEach(deleteEmptyChildren = o => 
  o.children && o.children.length 
    ? o.children.forEach(deleteEmptyChildren) 
    : delete o.children);
3
Jeto 26 janv. 2019 à 19:33