2017-10-13 14 views
0

私はrxjsが新しく、ツリー内のIDでノードを見つけるアルゴリズムを見つける必要があります。これは、ルートを見つけることができないですrxjsツリー検索

const value= "c.1.3"; 
const tree= [ 
    { 
    "id": "c.1", 
    "children": [ 
     { 
     "id": "c.1.1" 
     }, 
     { 
     "id": "c.1.2" 
     }, 
     { 
     "id": "c.1.3" 
     } 
    ] 
    } 
]; 

const findTree= (tree)=>Rx.Observable.from(tree) 
    .mergeMap(node=>{ 
    if(!!node.children) 
     return findTree(node.children); 
    return Rx.Observable.of(node); 
    }) 
    .find(node=>node.id==value); 
findTree(tree).subscribe(console.info); 

、私は歩くのid開始に一致する葉を投げると、私はホイールを発明だと破棄したいと思います:それは(gistrunにおける公共要旨として入手可能)私の最善のアプローチです。

  1. 最初のレベルで検索を維持するにはどうすればよいですか?
  2. regexpでフィルタリングする演算子はありますか?
  3. すべてのrxjsオペレータは再帰的な検索を行いますか?

ありがとうございました。

+1

私の最初の質問は、なぜこのコードを観測可能にしたいのですか? –

+0

反応的なアプローチの新しさとして、すべてをストリームとして実装しようとしているので、特別な必要はありません。時間内に無期限に成長するタグ付けシステムに関連して、機能(不変性、副作用無し、宣言性)と反応性(elacticity)の利点を管理できるかどうか疑問です。私はこの解決策に多くの回避策を持っていますが、私は本当にこれについて興味があります... – jgpATs2w

答えて

1

[OK]をツリーの例で詳しく説明しませんが、私はあなたの質問に答えることができ、これはいくつかのことを理解するのに役立ちます。

どのように維持することができる状態

それを行う1つの簡単な方法は、一時的なオブジェクト

Observable.of(1) 
      .flatMap(number => Observable.of({ start: number, value: 'a' })) 
      .subscribe(({start, value}) => console.log(start + '/' + value)); // output: 1/a 

正規表現によるフィルタ処理するすべてのオペレータがありますで、あなたの状態を保存するのですか?

ありませんが、あなたは簡単に自分がどれrxjsオペレータが再帰的な検索を行うこと

let names$ = Observable.of('adam', 'amy', 'ben'); 
let regex = /a.*/; 

names$.filter(name => regex.test(name)) // emits: 'adam', 'amy 

ようにそれを行うことができますか?

はい、展開演算子があります。ここにあなたに道案内をするべき簡単な例があります

Observable.of(3) 
      .expand(x => Observable.of(x-1)) 
      .takeWhile(x => x >= 0); // emits: 3, 2, 1, 0