1

我想将任意但类似键控的对象流转换为 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()但是,仅创建了标题行,因为我认为这是第一个流未完全消耗的背压问题。

那么,我怎样才能“窥视”流的第一个元素,然后根据该信息处理流呢?

4

1 回答 1

0

在我看来,您的问题是您一开始就.fork()呼吁streamlet headerStream = stream.fork()....

现在它几乎就像你得到了stream(a)and stream(b),在哪里return headerStream.flatMap...进行操作,stream(b)等待stream.fork().pick(headers)...你开始操作stream(b)

只需取消这两个stream.fork()电话,您就应该做好准备。

于 2016-06-14T04:02:32.467 回答