如何使用用户定义的相等函数在Javascript中创建一组用户定义的对象

How to create a Set of user-defined objects in Javascript with a user-defined equality function?

本文关键字:定义 用户 创建 一组 对象 何使用 函数 Javascript      更新时间:2024-04-26

我对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