【发布时间】:2017-01-28 18:35:03
【问题描述】:
首先,我对流还很陌生,所以我仍在掌握一些常见的模式。
在许多库中,我们可以使用 .groupBy(keySelectorFn) 将流拆分为流。例如,此流根据每个对象中 'a' 的值拆分为流(伪代码,不基于任何特定库):
var groups = Stream.of(
{ a: 1, b: 0 },
{ a: 1, b: 1 },
{ a: 2, b: 2 },
{ a: 1, b: 3 }
)
.groupBy(get('a'));
假设我想根据该组的 'a' 的值来不同地处理组:
groups.map(function(group) {
if (..?) {
// Run the group through some process
}
return group;
});
如果不消耗每个组的第一个元素,我看不到如何获取“a”的值(如果消耗了组的第一个元素,则该组不再完整)。
在我看来,这似乎是我想用流做的一件相当普遍的事情。我是否采取了错误的方法?
--- 编辑 ---
以下是我遇到的问题的更具体示例:
var groups = Stream.of(
{ a: 1, b: 0 },
{ a: 1, b: 1 },
{ a: 2, b: 0 },
{ a: 2, b: 1 },
{ a: 2, b: 2 },
{ a: 1, b: 2 }
)
.groupBy(get('a'));
如何选择 a === 1 的前 1 个对象和 a === 2 的前 2 个对象,并直接传递任何其他对象?这在我看来是合乎逻辑的:
groups.chain(function(group) {
return group.key === 1 ?
group.take(1) :
group.key === 2 ?
group.take(2) :
group ;
});
但是 group.key 不存在(即使它存在也会看起来有点……臭)。
【问题讨论】:
-
你在寻找这样的东西吗?:jsbin.com/haliqerita/edit?js,console
标签: javascript stream rxjs bacon.js ramda.js