使用highland.js

时间:2016-03-14 14:53:24

标签: javascript stream reactive-programming highland.js

我想将任意但类似键控的对象流转换为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()的背压问题是第一个流没有完全消耗。

那么,我如何“查看”流的第一个元素,然后根据该信息处理流?

1 个答案:

答案 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()来电,您就应该设置。