2017-08-21 1 views
1

Je la structure de données suivantesJavascript mettre en œuvre le filtrage profond des données JSON imbriquées

tasks = [{ 
    id: 1, 
    name: "task1", 
    subtasks: [ 
     { 
     id: 4, 
     name: "task2", 
     subtasks: [{ 
      id: 11, 
      name: "task to remove", 
      completed: false 
     }] 
     }, 
     { 
     id: 6, 
     name: "task to remove", 
     subtasks: [] 
     }, 
     { 
     id: 7, 
     name: "parent task to keep", 
     subtasks: [{ 
      id: 11, 
      name: "task to keep", 
      completed: true 
     }] 
     } 
    ] 
}, 
{ 
    id: 44, 
    name: "task to keep", 
    subtasks: [{ 
    id: 55, 
    name: "task to keep", 
    completed: true 
    }, 
    { 
    id: 66, 
    name: "task to delete", 
    completed: false 
    } 
    ] 
} 
] 

Avec niveau illimité de nidification, seules les tâches de feuilles ont le drapeau terminé et je dois filtrer uniquement les tâches qui sont terminés et garde-les avec leurs parents.

Je regarde lodash mais il ne semble pas avoir un filtre profond. Je pense maintenant à utiliser une traversée d'arbre pour filtrer les tâches.

Y at-il un moyen facile de mettre en œuvre quelque chose comme ça avec lodash?

+1

s'il vous plaît ajouter un résultat voulu et ce que vous avez essayé. –

Répondre

0

Vous vouliez une solution de lodash. Je crois que cette fonction récursive fait l'affaire.

function completed (task) { 
    // if it is a leaf node, just return true when it is completed 
    if (_.has(task,'completed')) { 
     return task.completed; 
    } 

    // if it has subtasks, then use our filter on all the subtasks ... 
    if (_.has(task,'subtasks')) { 
     task.subtasks = _.filter(task.subtasks, completed); 

     // ... and only return true if there are subtasks left after filtering 
     return task.subtasks.length; 
    } 

} 

console.log(_.filter(tasks,completed)); 
+0

Notez que cette solution mute le tableau d'origine. – ryeballar

0
bien

, ce que vous voulez peut être atteind par une fonction recussive, mais (parce que vous voulez une solution facile) est une solution ici avec un rappel comme second argument avec JSON.parse et nous allons l'analyser de chaîne; Mais, s'il vous plaît noter, facile dosen't toujours signifié performance efficace!

//your data 
 
tasks = [{ 
 
     id: 1, 
 
     name: "task1", 
 
     subtasks: [{ 
 
       id: 4, 
 
       name: "task2", 
 
       subtasks: [{ 
 
        id: 11, 
 
        name: "task to remove", 
 
        completed: false 
 
       }] 
 
      }, 
 
      { 
 
       id: 6, 
 
       name: "task to remove", 
 
       subtasks: [] 
 
      }, 
 
      { 
 
       id: 7, 
 
       name: "parent task to keep", 
 
       subtasks: [{ 
 
        id: 11, 
 
        name: "task to keep", 
 
        completed: true 
 
       }] 
 
      } 
 
     ] 
 
    }, 
 
    { 
 
     id: 44, 
 
     name: "task to keep", 
 
     subtasks: [{ 
 
       id: 55, 
 
       name: "task to keep", 
 
       completed: true 
 
      }, 
 
      { 
 
       id: 66, 
 
       name: "task to delete", 
 
       completed: false 
 
      } 
 
     ] 
 
    } 
 
] 
 

 
//solution 
 
var finalTasks = JSON.parse(JSON.stringify(tasks), (k, v) => { 
 
    if (Array.isArray(v)) { 
 
     return v.filter(u => u); 
 
    } else if (typeof v === "object" && !(v.subtasks && v.subtasks.length) && !v.completed) { 
 
     return undefined; 
 
    } 
 
    return v; 
 
}); 
 

 
console.log(finalTasks);