You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Collections.js的SortedSet中基于字典ts键实现自定义比较

解决Collections.js SortedSet按字典指定键排序的问题

这个问题我之前也碰到过!Collections.js的SortedSet默认没法直接比较对象,因为它不知道你要按哪个字段来排序,所以添加第二个对象时就会抛出那个"无法比较不等值"的错误。

要解决这个问题,核心就是给SortedSet传入自定义的比较函数,告诉它基于字典里的ts字段(转成Date对象)来做比较。直接看修改后的代码:

var SortedSet = require("collections/sorted-set");

// 创建SortedSet时传入自定义比较器,基于ts字段对应的Date排序
var my_set = new SortedSet([], function(left, right) {
    // 把ts字符串转为Date对象(如果你的ts已经是Date类型,直接用left.ts即可)
    const leftDate = new Date(left.ts);
    const rightDate = new Date(right.ts);
    
    if (leftDate < rightDate) return -1; // left排在right前面
    if (leftDate > rightDate) return 1;  // right排在left前面
    return 0; // ts相同则视为相等,SortedSet不会重复添加
});

var my_dict = {"value1": 1, "ts": "2020-07-19T08:18:50.206Z"};
var my_dict2 = {"value1": 2, "ts": "2021-07-19T08:18:50.206Z"};

my_set.add(my_dict);
my_set.add(my_dict2); // 现在可以正常添加,不会报错了

关键点说明:

  • SortedSet的构造函数第二个参数就是自定义比较器,它接收两个待比较的对象left和right
  • 我们将ts字符串转为Date对象后做大小比较,返回值规则是:
    • 返回-1:表示left应该排在right之前
    • 返回1:表示right应该排在left之前
    • 返回0:表示两个对象在排序逻辑中是相等的,此时SortedSet不会重复添加该元素
  • 如果你的ts字段本身已经是Date类型(不是字符串),可以去掉new Date()的转换步骤,直接比较left.ts和right.ts就行

这样就能让SortedSet按照你想要的ts字段来排序存储字典对象啦!

内容的提问来源于stack exchange,提问作者Mehant Kammakomati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 15:17:49