创建可出租的 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,
我真的不清楚我做错了什么,在这里。由于很难在 plunkr
或 jsfiddle
等大多数代码游乐场中演示 rxjs
,至少据我所知,我准备了一个游乐场环境来演示我在 [=36] 上的工作=],如果有帮助的话。
您将在 playground/index.ts
文件中找到所有相关代码。我已经尽我所能抽象出 any 知识 angular 的需要,因为我已经煞费苦心地指定了应该单独留下的部分继续在右侧显示输出。如果您不知道 angular,但可以帮助 rxjs
,您应该能够在不影响该设置的情况下工作。
STACKBLITZ PLAYGROUND
您的代码运行良好,只是 es6 模板字符串 ${} 将您的数组展平为字符串。如果您 console.dir 或记录结果,您将看到检索到的正确数组。
我正在尝试在 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,
我真的不清楚我做错了什么,在这里。由于很难在 plunkr
或 jsfiddle
等大多数代码游乐场中演示 rxjs
,至少据我所知,我准备了一个游乐场环境来演示我在 [=36] 上的工作=],如果有帮助的话。
您将在 playground/index.ts
文件中找到所有相关代码。我已经尽我所能抽象出 any 知识 angular 的需要,因为我已经煞费苦心地指定了应该单独留下的部分继续在右侧显示输出。如果您不知道 angular,但可以帮助 rxjs
,您应该能够在不影响该设置的情况下工作。
STACKBLITZ PLAYGROUND
您的代码运行良好,只是 es6 模板字符串 ${} 将您的数组展平为字符串。如果您 console.dir 或记录结果,您将看到检索到的正确数组。