如何使用用户定义的相等函数在Javascript中创建一组用户定义的对象
How to create a Set of user-defined objects in Javascript with a user-defined equality function?
我对Javascript很陌生,想知道是否可以创建一组用户定义的对象,使我能够指定用于进行相等比较的函数?
这里有一个人为的例子来说明我正在寻找的功能:
myClass = function(val){
var self = this;
self.val = val
self.equals = //used defined equals function
}
a = new myClass(1.0)
b = new myClass(2.0)
c = new myClass(2.0)
s = new Set() //does not have to be actual "Set"
s.add(a)
s.add(b)
s.add(c)
s.size === 2 //returns true
s.has(a) //returns true
s.has(b) //returns true
s.has(c) //returns true
我发现了Set实现(像这个),但它似乎只是为值而设计的,而不是用户定义的对象。我怀疑还有其他实现使用===
,但这对我的情况没有用处,因为我也不相信我可以覆盖===
。
我的问题和这个问题很相似。我再次发布它是因为:a)我不一定需要本机ES6解决方案,并且愿意使用第三方库。b)这个问题发布已经有一段时间了。
如果您愿意使用/覆盖valueOf
,那么您可以这样进行:
// Implementation of special Set:
function mySet() {
var self = this;
self.size = 0;
// Use a private map that will be keyed by the valueOf() of each added item:
var map = new Map();
self.add = function (item) {
map.set(item.valueOf(), item);
self.size = map.size;
};
self.has = function (item) {
return map.has(item.valueOf());
};
self[Symbol.iterator] = function* () {
for (var pair of map) {
yield pair[1]; // return the item ( not the valueOf() in [0])
}
};
// etc...
}
// Test code:
myClass = function(val){
var self = this;
self.val = val;
self.valueOf = function () { return self.val; };
}
a = new myClass(1.0);
b = new myClass(2.0);
c = new myClass(2.0);
s = new mySet(); //does not have to be actual "Set"
s.add(a);
s.add(b);
s.add(c);
document.write('size: ' + s.size + '<br>');
document.write('has(a): ' + s.has(a) + '<br>');
document.write('has(b): ' + s.has(b) + '<br>');
document.write('has(c): ' + s.has(c) + '<br>');
for (item of s) {
document.write('stored item: ' + JSON.stringify(item) + '<br>');
};
编辑
几个月后,我回答了一个类似的问题,我不建议使用valueOf,而是建议使用一个可以提供给MySet构造函数的函数,默认为JSON.stringify
。
相关文章:
- Meteor-添加用户自定义字段的方法不起作用
- 如何在用户按下F5键或单击浏览器时显示自定义的fancybox's后退/关闭按钮
- Can用户'MediaWiki上的自定义JavaScript调用Lua模块
- 如何获取用户's输入并返回我定义的匹配变量的值
- 使用具有用户定义字段的新请求者创建新的Zendesk票证
- jquery返回ajax响应和用户定义的变量到函数
- 阻止用户在Netsuite中使用标准/未自定义的表单
- 如何使用用户定义的值来增加Javascript中的值
- Angular 2中组件的自定义用户模板
- 从自定义用户控件更新contenttemplate下页面中控件的id
- 从 JQuery 添加 asp.net 自定义用户控件
- 将自定义用户代理关联到特定的谷歌浏览器页面/标签页
- 当使用ajax请求时,是否可以自定义用户代理参数
- 为什么人们要在jQuery对象中添加自己的自定义/用户函数
- 护照JWT要求.在我的一条路由中没有定义用户
- 用自定义用户界面设备钩入openseaddragon
- 自定义用户HTML输入安全性
- 扩展解析.用户转换为自定义用户类
- 如何将自定义用户数据添加到流星帐户
- Alfresco ECM的自定义用户界面