0

我正在尝试对 in 进行一些string操作rjxs,虽然我可以string通过类和arrayin类的内置行为来完成它,Javascript但我想将此作为练习来了解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方法,我知道我将结果rxjs作为发送到Observable,但是我在掌握如何从那里真正处理它而不过度嵌套到map运算符中时遇到了非常麻烦的时间。

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

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

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

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

阅读 上的文档lettable operators,看到这里,看起来这应该是一件很容易创建的事情。从理论上讲,它在我的脑海中应该是这样的;

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]::, 键 || 值,键 || 值,键 || 值, ,
值, 值, , 值, 键 || 键[键1] = 值 | 键[键2] = 值,键 || 价值,

我真的不清楚我做错了什么,在这里。由于很难rxjs在大多数代码游乐场中进行演示,例如plunkror jsfiddle,至少据我所知,我已经准备了一个游乐场环境来演示我的工作stackblitz,如果它有帮助的话。

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

STACKBLITZ 游乐场

4

1 回答 1

1

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

于 2018-01-03T08:24:07.747 回答