创建可出租的 rxjs "string.split" 运算符

creating lettable rxjs "string.split" operator

我正在尝试在 rjxs 中进行一些 string 操作,而我 可以 通过 [=16] 上的内置行为来完成它=] class 和 Javascript 中的 array class,我想以此为练习来进一步了解 rxjs 并理解流利的语言代码流更好。

为此,我必须找到一种适合 fluent 解决方案的方法,而不是像我在大多数 rxjs 中看到的一系列变量赋值示例。

基本上,情况是这样的;我有一串文字;

const example = `
    key || value
    key || value
    key || value

    value
    value

    value
    key || key[key1] = value | key[key2] = value
    key || value
`;

我需要做的第一件事是使用string.split('\n')创建一个字符串数组,这样我就可以遍历每一行并执行进一步的操作。

example.string.split('\n') 确实给出了预期的结果,但是尝试将其发送到 rxjs 开始得到相当复杂的收益。使用 pipe 方法,我知道我将结果作为 Observable 发送到 rxjs,但我真的很难掌握如何从那里真正处理它而没有过多的嵌套进入 map 运算符。

例如,如果我这样做...

of(example.string.split('\n')).pipe(
   map(results => results.toString().split('||')),
   map(results => ... ),
   ...
).subscribe();

可以 开始了解我正在寻找的东西,但我真正想做的是...

of(example).pipe(
   split('\n'),
   split('||'),
   concatMap(results => ...)
).subscribe();

阅读 documentation on lettable operators, seen here,看起来这应该是一个很容易创建的东西。理论上,我心目中应该是这样的;

const split = (separator: string) => <T>(source: Observable<T>) =>
    new Observable(observer => {
        source.subscribe({
            next(x) { observer.next(x.toString().split(separator)); },
            error(err) { observer.error(err); },
            complete() { observer.complete(); }
        })
    });

所以这应该使整个代码足够明显;

of(example).pipe(
    split('\n')
).subscribe(result => console.log(`[n]::${result}`));

但这并没有给我真正的期望。我希望得到 array 行,但如果我输出它,我会得到 ...

[n]::, key || value, key || value, key || value, ,
value, value, , value, key || key[key1] = value | key[key2] = value, key || value,

我真的不清楚我做错了什么,在这里。由于很难在 plunkrjsfiddle 等大多数代码游乐场中演示 rxjs,至少据我所知,我准备了一个游乐场环境来演示我在 [=36] 上的工作=],如果有帮助的话。

您将在 playground/index.ts 文件中找到所有相关代码。我已经尽我所能抽象出 any 知识 angular 的需要,因为我已经煞费苦心地指定了应该单独留下的部分继续在右侧显示输出。如果您不知道 angular,但可以帮助 rxjs,您应该能够在不影响该设置的情况下工作。

STACKBLITZ PLAYGROUND

您的代码运行良好,只是 es6 模板字符串 ${} 将您的数组展平为字符串。如果您 console.dir 或记录结果,您将看到检索到的正确数组。