2017-07-14 4 views
0

[ここに画像の説明を入力してください] [1]何か仕事をするのに苦労しているように助けてください。私は私のアプリでツリービューを表すJSONを持っています。ReactJSフィルター複合体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 
        }] 
       } 
      ] 
     } 
    ] 
}; 

私がしたいことは、自分のJSONをたどり、選択したプロパティを持つエントリだけをtrueとして返します。

私はこれまでのところ成功しなかった多くのことを試みました、あなたは私を助けることができるでしょうか?

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

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

そして、フィルタ自体:

[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

'selected:true'はありません –

+0

selected trueはプログラムによって設定されています...例えばJSONを編集しました。 –

+0

これを達成するはずのコードを投稿できますか? 「JSONをトラバースする」と言うと、それをJavaScriptオブジェクトに解析していないと思います。 – Smaft

答えて

1

はこれをチェックしてください。私はそれがあなたの仕事に当てはまるべきだと思います。

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]))

私はnodeidを返しましたが、あなたが必要として、あなたはそれを変更することができます。

+0

ツリーに10k以上のノードがある場合、これはどのように実行されますか? –

+0

再帰レベルによって異なります。より小さな再帰 - より速い関数。 –

+0

私はデータを配列に強制しなければならなかったが、それはうまくいった! –