2017-10-13 166 views
0

我是rxjs的新手,需要找到一種算法來通過樹中的id查找節點。這是我的最好的方法(可作爲公共要點在gistrun):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開始的葉子和丟棄我發明了車輪。

  1. 如何維持一級搜索?
  2. 是否有任何運算符通過正則表達式篩選?
  3. 任何rxjs運算符都會執行遞歸查找嗎?

非常感謝。

+1

我的第一個問題是,爲什麼你想讓這段代碼可觀察? –

+0

沒有什麼特別的需要,因爲我試圖將所有東西都實現爲流。我想知道我是否可以用功能性(不可逆性,無副作用和可聲明性)和反應性(反常性)我的樹模型的好處來管理,這與標籤系統有關,該標籤系統將隨着時間無限增長。我對這個解決方案有很多解決方法,但我對此很好奇...... – jgpATs2w

回答

1

好吧,我不會詳細介紹你的樹例子,但我可以回答你的問題,這可能會幫助你找出一些事情。

我如何保持狀態

一個簡單的方法來做到這一點,是保存在臨時對象

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

是否有運營商通過正則表達式來過濾你的狀態?

沒有,但你可以自己做很容易像

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

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

任何rxjs操作者的遞歸找到?

是的,有擴展運算符。這是一個簡單的例子,它應該引導你的方式

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