如何在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
相关产品推荐
相关产品推荐

