2017-07-14 1 views
0

[Bildbeschreibung hier eingeben] [1] Bitte helfen Sie mir, während ich mich bemühe, etwas zur Arbeit zu bringen. Ich habe ein JSON, das eine Baumansicht in meiner App darstellt.ReactJS Filterkomplex Json

{ 
    name: 'Global', toggled: true, children: [ 
     { 
      name: 'Region A', nodeid: 0,chosen: true,pushed: false, 
      children: [ 
       { name: 'Town A', nodeid: 1, chosen: true, pushed: false, 
        children: [{ 
        name : "child 1", pushed: false, chosen:false 
        }] 
       }, 
       { name: 'Town B', nodeid: 2, chosen: false, pushed: false, 
        children: [{ 
        name : "child 2", pushed: false, chosen: false 
        }] 
       } 
      ] 
     } 
    ] 
}; 

Was ich tun möchte, ist Traverse durch meine JSON und nur die Einträge zurück, die die gewählte Eigenschaft als wahr haben.

Ich habe viele Dinge ohne Erfolg bisher versucht, können Sie mir helfen?

https://i.stack.imgur.com/r61MO.jpg

onPush(e){ 
     var chosennodes = filters.filterTreeChosen(this.state.data); 
     this.setState({selectednodes: chosennodes}); 
    } 

Dann wird der Filter selbst:

[Object.filter = (obj, predicate) => 
     Object.keys(obj) 
      .filter(key => predicate(obj\[key\])) 
      .reduce((res, key) => (res\[key\] = obj\[key\], res), {}); 

export const isChosen = (chosen) =>{ 
    return chosen == true; 
} 

export const filterTreeChosen = (nodes) => { 
    var filtered = Object.filter(nodes, node => node.chosen == true); 
    console.log(filtered); 
};][1] 

https://i.stack.imgur.com/IAXZ7.jpg

+0

Keine von denen haben "gewählt: wahr" –

+0

gewählt wahr ist programmgesteuert eingestellt ... Ich habe zum Beispiel die JSON bearbeitet. –

+0

Können Sie den Code posten, der dies erreichen soll? Wenn Sie "durch JSON traversieren" sagen, denke ich, dass Sie es nicht in ein JavaScript-Objekt zerlegen. – Smaft

Antwort

1

diese Check-out. Ich denke, es sollte für Ihre Aufgabe gelten. brauchen

const tree = { 
 
    name: 'Global', toggled: true, children: [ 
 
     { 
 
      name: 'Region A', nodeid: 0,chosen: true,pushed: false, 
 
      children: [ 
 
       { name: 'Town A', nodeid: 1, chosen: true, pushed: false, 
 
        children: [{ 
 
        name : "child 1", pushed: false, chosen:false 
 
        }] 
 
       }, 
 
       { name: 'Town B', nodeid: 2, chosen: false, pushed: false, 
 
        children: [{ 
 
        name : "child 2", pushed: false, chosen: false 
 
        }] 
 
       } 
 
      ] 
 
     } 
 
    ] 
 
}; 
 

 
function getChosenNodes (nodes) { 
 
    let result = []; 
 
    
 
    nodes.forEach(node => { 
 
    if (node.chosen) { 
 
     result = result.concat([node.nodeid]); 
 
    } 
 

 

 
    if (node.children) { 
 
     result = result.concat(getChosenNodes(node.children)); 
 
    } 
 
    }) 
 
    
 
    return result; 
 
} 
 

 
console.log(getChosenNodes([tree]))

Ich habe nur nodeid zurückgegeben, aber Sie können, wie Sie es ändern.

+0

Wie wird dies durchgeführt, wenn der Baum 10k oder mehr Knoten hat? –

+0

Es hängt von der Rekursionsebene ab. Kleinere Rekursion - schnellere Funktion. –

+0

Ich musste meine Daten in ein Array zwingen, aber es hat funktioniert! –