我想将任意但类似键控的对象流转换为CSV字符串流。为了做到这一点,我想要查看流中的第一个对象,并创建将添加到流前面的对象键的标题行。我已经达到了这个目的:
// Convert an object to a DSV
// NOTE: Assumes that all objects have the same properties!
export let toDSV = (delimiter=', ') => stream => {
let headerStream = stream.fork().head().flatMap(x => _.keys(x).collect());
return headerStream
.flatMap(headers => {
return _.sequence([
_([headers.join(delimiter)]),
stream.fork()
.pick(headers)
.map(_.values)
.flatMap(_.collect)
.invoke('join', [delimiter])
]);
});
};
对于以下流
_([{
foo: 1
bar: 2
baz: 3
}, {
foo: 2
bar: 1
baz: 4
}])
结果流应为:
foo, bar, baz
1, 2, 3
2, 1, 4
只创建了标题行,因为我认为fork()
的背压问题是第一个流没有完全消耗。
那么,我如何“查看”流的第一个元素,然后根据该信息处理流?
答案 0 :(得分:0)
我认为您的问题是,您在.fork()
开始时stream
呼叫let headerStream = stream.fork()...
。{/ 1}。
现在它几乎就像你有stream(a)
和stream(b)
,其中return headerStream.flatMap...
正在stream(b)
上运行而stream.fork().pick(headers)...
是等着你开始对stream(b)
进行操作。
只需修改这两个stream.fork()
来电,您就应该设置。