根据特定条件连接 RxJ 中的两个可观察流

2024-01-15

我有两个对象流:帐户和余额。

我需要根据以下内容合并(加入)两个流id and account_id

var accounts = Rx.Observable.from([
    { id: 1, name: 'account 1' },
    { id: 2, name: 'account 2' },
    { id: 3, name: 'account 3' },
]);

var balances = Rx.Observable.from([
    { account_id: 1, balance: 100 },
    { account_id: 2, balance: 200 },
    { account_id: 3, balance: 300 },
]);

预期是什么:

var results = [
    { id: 1, name: 'account 1', balance: 100},
    { id: 2, name: 'account 2', balance: 200},
    { id: 3, name: 'account 3', balance: 300},
];

这对于 RxJs 可行吗?

需要明确的是,我知道如何使用普通的 js/lodash 或类似的东西来做到这一点。就我而言,我从 Angular Http 模块获取这些流,所以我问在这种情况下我是否可以从 RxJs 中受益


根据您的评论之一,您的示例是模拟来自 Angular Http 调用的流。

所以而不是:

var accounts = Rx.Observable.from([
    { id: 1, name: 'account 1' },
    { id: 2, name: 'account 2' },
    { id: 3, name: 'account 3' },
]);

var balances = Rx.Observable.from([
    { account_id: 1, balance: 100 },
    { account_id: 2, balance: 200 },
    { account_id: 3, balance: 300 },
]);

我宁愿说它是:

var accounts = Rx.Observable.of([
    { id: 1, name: 'account 1' },
    { id: 2, name: 'account 2' },
    { id: 3, name: 'account 3' },
]);

var balances = Rx.Observable.of([
    { account_id: 1, balance: 100 },
    { account_id: 2, balance: 200 },
    { account_id: 3, balance: 300 },
]);

Why : from将逐一发出每一项,of将发出整个数组,我猜你的 http 响应是整个数组。

也就是说,您可能想要实现的是:

const { Observable } = Rx;

// simulate HTTP requests
const accounts$ = Rx.Observable.of([
  { id: 1, name: 'account 1' },
  { id: 2, name: 'account 2' },
  { id: 3, name: 'account 3' }
]);

const balances$ = Rx.Observable.of([
  { account_id: 1, balance: 100 },
  { account_id: 2, balance: 200 },
  { account_id: 3, balance: 300 }
]);

// utils
const joinArrays = (accounts, balances) =>
  accounts
    .map(account => Object.assign({}, account, { balance: findBalanceByAccountId(balances, account.id).balance }));

const findBalanceByAccountId = (balances, id) =>
  balances.find(balance => balance.account_id === id) || { balance: 0 };

const print = (obj) => JSON.stringify(obj, null, 2)

// use forkJoin to start both observables at the same time and not wait between every request
Observable
  .forkJoin(accounts$, balances$)
  .map(([accounts, balances]) => joinArrays(accounts, balances))
  .do(rslt => console.log(print(rslt)))
  .subscribe();

Output :

[
  {
    "id": 1,
    "name": "account 1",
    "balance": 100
  },
  {
    "id": 2,
    "name": "account 2",
    "balance": 200
  },
  {
    "id": 3,
    "name": "account 3",
    "balance": 300
  }
]

这是一个正在工作的 Plunker :https://plnkr.co/edit/bc0YHrISu3FT45ftIFwz?p=preview https://plnkr.co/edit/bc0YHrISu3FT45ftIFwz?p=preview

EDIT 1 :使用数组来组成结果可能不是性能的最佳主意,您可以尝试返回一个以帐户 ID 作为键的对象,而不是返回数组。这样你就可以简单地删除findBalanceByAccountId功能并拥有更快的应用程序(此处仅修改代码) :

const balances$ = Rx.Observable.of({
  1: { account_id: 1, balance: 100 },
  2: { account_id: 2, balance: 200 },
  3: { account_id: 3, balance: 300 }
});

// utils
const joinArrays = (accounts, balances) =>
  accounts
    .map(account => Object.assign(
      {}, 
      account, 
      { balance: balances[account.id].balance }
    ));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据特定条件连接 RxJ 中的两个可观察流 的相关文章

随机推荐

  • 如何在未安装 Git 的情况下应用“git diff”补丁?

    我的客户如何应用由git diff没有安装git 我尝试过使用patch命令 但它总是询问要修补的文件名 git diff gt patchfile and patch p1 lt patchfile 工作 但正如许多人在评论和其他答案中注
  • 检测移动 Web 应用程序是否位于本机 Facebook 应用程序中

    有没有办法检测我们的移动 Web 应用程序是否显示在本机 Facebook iOS 应用程序的 WebView 内 或者是否独立运行 据我们了解 我们不允许从他们的框架内获取 Facebook 积分 但我们are允许从我们自己的独立 Web
  • VBA宏使用单元格路径保存Excel文件

    我正在尝试使用硬线和单元格值的组合来保存文件以确定文件路径 In cell A29 我有一个输出这个的公式 2014 1月 高额现金 1 7 14 我得到一个预期 声明结束 error 代码是 ActiveWorkbook SaveAs F
  • 正则表达式替换%variables%

    我已经用了 30 分钟的时间来拔一撮头发了 我有一本字典 像这样 search replace foo bar 还有一个像这样的字符串 Foo bar foo search 我想用字典中的等效文本替换每个变量 Foo bar bar rep
  • Gradle:如何在控制台上打印依赖项工件 URL

    我们从maven转移到gradle 在maven中 使用build命令 我们可以清楚地看到从中获取依赖项的nexus URL 使用 gradle 我如何在项目构建时查看依赖项 URL 是否有任何命令行选项可以在 gradle 中执行此操作
  • 如何在 Laravel 队列中使用模型

    我正在尝试将邮件列表从 CSV 导入到我的数据库中 我的 Laravel 中有两个模型负责执行此操作 Target and Mailing one Target有很多Mailings 我正在使用带有 Beanstalkd 的队列系统 我在用
  • Redmine 3.3.0 (ruby on Rails 4.2.6) 样式表未生成/包含在 application.css 中

    我已经安装了 redmine 并设法启动它 但 UI 似乎缺少它的 css 样式 如果我点击 application SomeId css 的链接 它会显示一个包含以下消息的空 css This is a manifest file tha
  • UIGestureRecognizer 接收触摸但也将其转发给 UIControl

    你会如何允许UIGestureRecognizer of a UIView接收触摸事件 但也确保另一个 底层 上层UIView也收到同样的触摸事件 Lets say I have got the following view hierach
  • 三角形带上的纹理坐标

    我创建了一个带有 14 个顶点的几何着色器的立方体 感谢三角形条 现在的问题是如何放置我的纹理坐标 我有一个包含 3 个纹理的图像文件 立方体的顶面 底面 左 右 前 后面 我找不到为每个顶点提供纹理坐标的方法 14 我总是得到奇怪的纹理显
  • Python 3.5.1:QVariant 表示映射类型,无法实例化

    我正在使用 Python 3 5 1 我正在尝试运行此代码 但 QVariant 有问题 from PyQt4 QtCore import from PyQt4 QtGui import import sys class Model QAb
  • Python 多处理:比请求的进程更多

    为什么我看到这么多 python 进程在运行 在htop on RHEL 6 当我只使用 1 个核心时 对于相同的脚本 对于每个任务 我都会初始化一个管理处理的工作类 它会初始化其他类 但不会初始化任何子进程 tasks multiproc
  • Android SDK 的快速位图模糊

    目前 在我正在开发的 Android 应用程序中 我正在循环遍历图像的像素以使其模糊 对于 640x480 图像 这大约需要 30 秒 在浏览 Android Market 中的应用程序时 我遇到了一个包含模糊功能的应用程序 并且它们的模糊
  • 尝试启动 Firefox 时出现 Python Selenium 错误

    我在 ipython 笔记本中尝试使用 Selenium 打开 Firefox 时遇到错误 我环顾四周 发现了类似的错误 但没有任何错误与我收到的错误完全匹配 有人知道问题可能是什么以及我如何解决它吗 我使用的是 Firefox 22 我输
  • 在 Rakefile 中设置 rspec 2 任务

    我有一个看起来像这样的 Rakefile require rspec core rake task desc Run all RSpec tests RSpec Core RakeTask new spec 但这不起作用 例如 如果我尝试运
  • React 表单组件 onSubmit 处理程序不工作

    我有以下 React 组件 class Form extends React Component handleSubmit e e preventDefault let loginInput ReactDOM findDOMNode thi
  • Spring 事务因 iptables 命令而挂起

    作为进程错误处理的一部分 我们尝试使用以下 iptables 命令禁用进程与数据库计算机侦听器端口之间的通信 iptables A INPUT p tcp destination port
  • Cloud Foundry如何处理进程隔离?

    假设我使用 上提供的开源 Cloud Foundry 实现设置了自己的云cloudfoundry org http www cloudfoundry org 我部署的每个应用程序都会作为单独的用户运行吗 或者这里使用了VMWare的虚拟化技
  • MVC 中的 Bootstrap 模式,双背景 - 背景出现两次

    我在使用 jQuery 生成引导模式时注意到一个问题 在动态生成的部分视图 我的模式 中添加更多 JavaScript 会导致出现双背景 有谁知道为什么会发生这种情况 我正在使用 jquery 1 8 2 js 和 Bootstrap v3
  • 通过HTA触发宏的VBS(无法运行宏)

    我有一个 HTA 脚本 它最终触发代码的 vbs 部分来调用 VBA 宏 但由于某种原因我收到此错误 我已经确保启用了对 VBA 的信任访问 因此我觉得我的代码中的某些内容与 HTA 不兼容 这是代码 提前感谢您的宝贵时间
  • 根据特定条件连接 RxJ 中的两个可观察流

    我有两个对象流 帐户和余额 我需要根据以下内容合并 加入 两个流id and account id var accounts Rx Observable from id 1 name account 1 id 2 name account