rxjs树搜索

rxjs树搜索

问题描述:

我是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

好吧,我不会详细介绍你的树例子,但我可以回答你的问题,这可能会帮助你找出一些事情。

我如何保持状态

一个简单的方法来做到这一点,是保存在临时对象

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