【问题标题】:Using Highland.js to hydrate one stream with data from another使用 Highland.js 将一个流与来自另一个流的数据进行水合
【发布时间】:2022-02-03 03:25:14
【问题描述】:

假设我有两个Highland 流:

import hl from 'highland'

const accounts = hl([
  {id: 1, name: "Bob"},
  {id: 2, name: "Chris"},
]);

const accountData = hl([
  {id: 1, age: 21},
  {id: 2, age: 43},
]);

我想映射accounts 流并合并来自accountData 的额外数据,因此结果如下所示:

Highland.Stream<[
  {id: 1, name: "Bob", age: 21},
  {id: 2, name: "Chris", age: 43},
]>

这对于普通数组来说非常简单,但我想知道在使用流时是否可能。

【问题讨论】:

  • 数据是否进入按 ID 排序的两个流 - 两个流将依次发出id?如果是这样,则可以将 stream.Transform 与定制的 stream.Writable 组合以接受来自辅助流的数据。
  • 这不能保证。也不能保证accountData 流对accounts 中的每个id 都有记录。我想我需要将accountData 流消耗到一个数组中,并将其用作内存中的查找。

标签: node.js node-streams highland.js


【解决方案1】:
import hl from 'highland';

const accounts = hl([
  { id: 1, name: 'Bob' },
  { id: 2, name: 'Chris' }
]);

const accountData = hl([
  { id: 1, age: 21 },
  { id: 2, age: 43 }
]);

hl([ accounts, accountData ])
  .merge()
  .reduce(new Map(), (accum, account) => {
    const { id }        = account;
    const mergedAccount = Object.assign({}, accum.get(id), account);
    return accum.set(id, mergedAccount);
  })
  .map(map => [ ...map.values() ])
  .doto(console.log)
  .done(() => {});

输出:

[ 
  { id: 1, name: 'Bob', age: 21 },
  { id: 2, name: 'Chris', age: 43 } 
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2019-09-05
    • 2013-02-21
    相关资源
    最近更新 更多