使用 RxJs groupBy 以对象作为键

2024-02-08

我正在尝试使用groupBy使用 RxJ,我需要使用对象作为键。如果我不这样做,我会使用例如这样的简单字符串:

var types = stream.groupBy(
    function (e) { return e.x; }); //x is a string

然后一切顺利,我的订阅对于每个不同的密钥被调用一次,并且仅调用一次。但是如果我尝试使用对象,则会为每个元素调用订阅stream,即使某个密钥恰好与之前的密钥相同。

当然存在关于对象相等的问题,但这就是我感到困惑的地方,因为我不明白如何使用附加参数groupBy。最新版本的文档说有第三个参数可以是comparer,但它永远不会被调用。早期的文档讨论了密钥序列化器这是一个完全不同的想法,但这两种方法都不适合我。

查看 Rx 源代码,我看到尝试检查getHashCode功能,但我没有找到有关它的文档。代码如下:

var types = stream.groupBy(
    function (e) {
        return { x: e.x, y: e.y };   //is this valid at all?
    },
    function (e) { return e; },
    function (...) { return ???; }); //what am I supposed to do here?

是我想写的,但没有运气,而且我为第三个回调设置的任何内容都不会被调用。

这是怎么回事?


最简单的解决方案是确保您的关键函数返回数字或字符串。但如果你真的想返回一个对象作为你的键,那么你可以使用comparer and hashCode帮助groupBy。代替hashCode(这需要您返回一个数字),您可以使用valueOf它可以让你返回一个字符串。

hashCode and valueOf应该类似于时间:2019-03-17 标签:c#Object.GetHashCode http://msdn.microsoft.com/en-us/library/system.object.gethashcode(v=vs.110).aspx.

他们应该返回一个值,使得:

  • 被认为相等的两个键每次都应该返回相同的值。
  • 被认为不相等的两个键通常应返回不同的值(以最大限度地减少冲突)。你越能确保这一点,词典的效率就越高。

区别在于hashCode应该返回一个数字并且valueOf可以返回一个数字或一个字符串。因此valueOf更容易实施。

规则为comparer是它需要 2 个键值并且应该返回true来表示平等和false来表示不平等。

因此,您可以将示例编写为:

var valueOf = function () {
    return JSON.stringify(this);
};

var keyCompare = function (a, b) { return a.x === b.x && a.y === b.y; };

var types = stream.groupBy(
    function (e) {
        return { x: e.x, y: e.y, valueOf: valueOf };   //is this valid at all?
    },
    function (e) { return e; },
    keyCompare);

但如果你的valueOf函数实际上会生成与比较器匹配的唯一值,并且您并不真正关心密钥是否作为实际对象传输到下游,然后让您的生活更轻松,并将密钥转换为字符串并使用字符串密钥,如下所示:

var types = stream.groupBy(
    function (e) { return JSON.stringify({ x: e.x, y: e.y }); },
    function (e) { return e; });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 RxJs groupBy 以对象作为键 的相关文章

随机推荐

  • 如何将 content:// URI 转换为实际文件路径?

    如何获取 SD 卡上 content uri 指向图像的实际文件路径 我已经调整了 hooked82链接到的代码 protected String convertMediaUriToPath Uri uri String proj Medi
  • 在 HTML 中添加引导程序

    我要使用引导程序 http getbootstrap com 建立我的前端 我还使用 JSP 和 JSTL 我在互联网上的一些文章中读到的是添加外部 javascript 文件的正确方法应该写在正文结束标记之前 以便更好地优化页面 现在我正
  • Java 语言规范第三版勘误表

    我广泛使用 JLS 作为学习和教学资源 但我注意到其中存在一些错误 有一些简单的拼写错误 例如金龙5 1 4 http java sun com docs books jls third edition html conversions h
  • 负载均衡 Amazon EC2 上的节点 socket.io

    我有一个在 Amazon AWS 上运行的标准 LAMP EC2 实例设置 为了满足实时更新的需求 我还安装了 Node js socket io 和 Express 现在正处于应用程序负载平衡的阶段 这一切都有效 但我的套接字却不起作用
  • 删除非 ASCII 字符(使用 Microsoft.Office.Interop.Excel)

    我正在尝试从 excel csv 文件中删除所有非 ascii 字符 在线阅读和搜索后 我发现了一篇帖子 其中给了我代码xlWorksheet UsedRange Replace u0000 u007F 删除字符但每次但字符仍然存在于文件中
  • 如何在管道内使用“if”语句

    我正在尝试使用if管道内 我知道有where alias 过滤器 但是如果我想仅在满足特定条件时才激活过滤器怎么办 我的意思是 例如 get something someone eq somespecific format table 如何
  • 从 gtsummary 包中的 tbl_summary 对象获取 LaTex 输出的最佳方法[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我正在努力准备一份文档出版 并且正在 LaTeX 中完成所有工作 然而 我现在才注意到gtsummary尚不支持其表格的 LaTeX
  • 帧持续时间 - UIImage 数组到电影

    我已经通过此代码成功完成了 将 UIImage 数组导出为电影 部分 在导出的视频中 每个图像显示 1 秒 但我需要 每个图像将在导出的视频中显示 5 秒 我需要做的最小改变是什么 这是我的代码 var outputSize CGSize
  • java正则表达式模式分割逗号

    String line a 1 b 1 2 c d 1 e 1 11 String tokens line split for String t tokens System out println gt t System out print
  • 异常日志文件的最佳位置 (Windows)

    异常日志应该放在哪里的问题已经在这里讨论过一两次 或多次 其中一个建议是应用程序永远不应该写入安装文件夹 但是 如果我将日志放在 appdata 中的某个位置 这意味着每个用户都有自己的一组日志 我更喜欢将所有日志放在一个位置 在最新的 M
  • 循环进口地狱

    Python 是一种极其优雅的语言 好吧 除了 除了进口 我仍然无法让它按照我认为自然的方式工作 我有课MyObjectA这是在文件中mypackage myobjecta py 该对象使用一些实用函数 这些函数位于mypackage ut
  • 停止将 typescript-eslint/explicit-module-boundary-types 应用于不使用 Typescript 的 vue 组件

    我在用着vue我刚刚更新了 typescript eslint eslint plugin 3 10 1 我的项目包含几个组件 其中一些正在使用javascript和别的typescript Warning 我对里面的方法有这个警告non
  • 在 SQL LIKE 语句中使用变量

    我有一个存储过程 MSSQL 2k5 它将为 LIKE 子句接受一个变量 如下所示 DECLARE SearchLetter2 char 1 SET SearchLetter t SET SearchLetter2 SearchLetter
  • 为什么glBufferSubData需要等到VBO不被glDrawElements使用?

    在 OpenGL Insights 中 它说 OpenGL 驱动程序必须等待 因为使用了 VBO 由上一帧的 glDrawElements 绘制 这让我很困惑 据我所知 glBufferSubData会将数据复制到临时内存 然后再传输到GP
  • 使用 Box Windows SDK v2 库对 C# 桌面应用程序中的 Box 进行身份验证

    看起来这应该是一件简单的事情 但我找不到示例或足够详尽的文档来弄清楚 我有一个 C 桌面应用程序 我想通过 Box API 与 Box 集成 我认为使用 Box Windows SDK v2 for NET 将是最佳选择 有人能给我指一个适
  • Php:检查电子邮件内容是否为垃圾邮件

    我正在创建一个新闻通讯功能 允许用户发送电子邮件 由于存在恶意人员想要发送垃圾邮件 因此我希望能够检查并查看创建的邮件是否是垃圾邮件 我已经研究了几种不同的方法 例如尝试垃圾邮件杀手 但您需要完整的电子邮件 而我稍后才会得到 或者您需要安装
  • 即使文件不存在,为什么 SELECT INTO OUTFILE 也会给出文件存在错误?

    该文件肯定不存在 但我还是收到错误 I do rm tmp records materialized view txt mysql gt SELECT FROM records materialized view INTO OUTFILE
  • AngularJS:如何获取模板的 $location.path

    我需要模板中 url 的当前路径 location path 的内容 但不是通过控制器 因为我有很多控制器 并且我不想重复声明 scope currentUrl location path 感谢您的建议 AngularJS 模板只能看到范围
  • 用于未定方程组的 C++ 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我一直在寻找一个 C 库来解决这样的不确定系统 q 是向量 w x y z 变量和 a b c d 常
  • 使用 RxJs groupBy 以对象作为键

    我正在尝试使用groupBy使用 RxJ 我需要使用对象作为键 如果我不这样做 我会使用例如这样的简单字符串 var types stream groupBy function e return e x x is a string 然后一切