/ / filtra un oggetto profondamente annidato e restituisce un nuovo oggetto: json, loop, object, filter, lodash

filtra un oggetto profondamente annidato e restituisce un nuovo oggetto: json, loop, object, filter, lodash

Ho un oggetto nidificato di 4 livelli che assomiglia a questo

{
"name": "“Mike”",
"id": 1000,
"img": "“#”",
"children": [
{
"name": "“Jack”",
"id": 1100,
"img": "#",
"married": true,
"children": [
{
"name": "”Julia“",
"id": 1110,
"img": "#"
}
]
},
{
"name": "”Lily“",
"id": 1200,
"img": "#",
"married": true,
"children": [
{
"name": "”Coco“",
"id": 1210,
"img": "#",
"married": true,
"children": {
"name": "”Olivia“",
"id": 1211,
"img": "#",
"married": false
}
}
]
}
]
}

Ho una matrice di idToDisplay = ["1000","1100","1200","1210"] Voglio filtrare gli ID e tralasciare le parti che non corrispondono idToDisplay in modo che possa ottenere un nuovo oggetto assomiglia a questo

{
"name": "“Mike”",
"id": 1000,
"img": "“#”",
"children": [
{
"name": "“Jack”",
"id": 1100,
"img": "#",
"married": true,
]
},
{
"name": "”Lily“",
"id": 1200,
"img": "#",
"married": true,
"children": [
{
"name": "”Coco“",
"id": 1210,
"img": "#",
"married": true,
}
]
}
]
}

Qual è il modo migliore per ripetere? Molte grazie!

risposte:

1 per risposta № 1

Se vuoi solo modificare i tuoi dati sul posto, puoi attraversarlo in modo ricorsivo in questo modo:

var data = ... your data ...
var ids = [1000, 1100]
var handleNode = function(node) {
node.children = node.children.filter(x => ids.includes(x.id))
node.children.forEach(handleNode)
}
if (!ids.includes(data.id)) {data = {}}
handleNode(data)

Successivamente i tuoi dati sono costituiti solo da nodi con ID corrispondenti.