Jam*_*ley 6 observable rxjs angular
我有一个包含任务集合的模拟文件,每个任务都有截止日期.目前(下面)我创建了一个简单的observable,当订阅时,它返回模拟任务的集合.我未能弄清楚的是我如何处理平面数组的任务以按截止日期对它们进行分组,返回一个类似的结构;
// Current data structure (unstructured)
[{due: "2016-01-01"}, {due: "2016-01-01"}, {due: "2016-01-02"}, ...]
// Desired structure for consumption
{
"2016-01-01": [{...}, {...}],
"2016-01-02": [{...}, {...}, {...}],
"2016-01-03": [{...}]
}
Run Code Online (Sandbox Code Playgroud)
我目前的可观察创作代码如下;
// Service...
tasks: Observable<Task[]>;
// init() called from the constructor
private init() {
this.tasks = Observable.create(observer => {
observer.next(mockTasks);
});
}
getTasks() {
return this.tasks;
}
Run Code Online (Sandbox Code Playgroud)
在我的组件中消耗的如下;
// Component...
ngOnInit() {
this.taskService.getTasks().subscribe(tasks => {
this.tasks = tasks; // Contains the collection of tasks as expected
});
}
Run Code Online (Sandbox Code Playgroud)
这很好 - 我按照预期完成了我的完整任务.我已经尝试使用groupBy运算符来实现上述目的,但是可观察到的创建的via Observable.create()似乎没有可用的方法.我一直在指这个资源试图实现这个,我注意到它Observable.from()被用来代替.create(),但是这似乎也不是我服务中的可用功能.
groupBy)如上所述格式化数据(以及如何实现)?或者应该手动格式化?谢谢!
我猜你混合了几件事。可观察量总是包含时间因素,因此您可以通过可观察量的帮助随着时间的推移发出事物。如果您只想将事物分组到静态数组中,则可观察量是错误的方法。
在你的情况下,你有几个数据
const tasks =
[ {due: "2016-01-01"}
, {due: "2016-01-01"}
, {due: "2016-01-02"}
];
Run Code Online (Sandbox Code Playgroud)
如果你打算将它们放入 Observable 中,这是可能的,但它只会输出数组一次,仅此而已。
const observable = Rx.Observable.of(tasks);
observable.subscribe(x => console.log('All at once', x));
// output: All at once [ {due: "2016-01-01"}, {due: "2016-01-01"}, {due: "2016-01-02"} ];
Run Code Online (Sandbox Code Playgroud)
如果你想及时分发它们 - 现在我们越来越接近 Observables 的用途 - 你也可以这样做
const observable2 = Rx.Observable.from(tasks);
observable2.subscribe(x => console.log('One after the other', x));
// output: 'One after the other' {due: "2016-01-01"}
// 'One after the other' {due: "2016-01-01"}
// 'One after the other' {due: "2016-01-02"}
Run Code Online (Sandbox Code Playgroud)
现在假设我们有一个数据源,偶尔会提供一个新任务,并且我们希望随着时间的推移对它们进行分组。它看起来是这样的:
const observable3 = Rx.Observable.from(tasks);
observable3
.scan((acc, obj) => {
let oldValue = acc[obj.due] || 0;
acc[obj.due] = ++oldValue;
return acc;
}, {})
.subscribe(x => console.log(x));
// output: { 2016-01-01: 1 }
// { 2016-01-01: 2 }
// { 2016-01-01: 2, 2016-01-02: 1 }
Run Code Online (Sandbox Code Playgroud)
因此,根据您的需求,Observables 可能是正确的选择。如果数据按时间分布,则完全可以如上所示对它们进行分组。我已将代码上传到 jsbin来使用它。
| 归档时间: |
|
| 查看次数: |
2263 次 |
| 最近记录: |