Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用用户定义的相等函数在Javascript中创建一组用户定义的对象?_Javascript - Fatal编程技术网

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

如何使用用户定义的相等函数在Javascript中创建一组用户定义的对象?,javascript,Javascript,我对Javascript非常陌生,想知道是否有可能创建一组用户定义的对象,以允许我指定用于进行等式比较的函数 下面是一个精心设计的示例,仅用于说明我正在寻找的功能: myClass = function(val){ var self = this; self.val = val self.equals = //used defined equals 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)该问题发布已经有一段时间了

如果您愿意使用/override,那么您可以这样继续:

//特殊集合的实现:
函数mySet(){
var self=这个;
self.size=0;
//使用将由每个添加项的valueOf()设置关键帧的私有映射:
var map=newmap();
self.add=功能(项目){
map.set(item.valueOf(),item);
self.size=map.size;
};
self.has=功能(项目){
返回map.has(item.valueOf());
};
self[Symbol.iterator]=函数*(){
for(映射的var对){
yield pair[1];//返回项(不是[0]中的valueOf())
}
};
//等等。。。
}
//测试代码:
myClass=函数(val){
var self=这个;
self.val=val;
self.valueOf=函数(){return self.val;};
}
a=新的myClass(1.0);
b=新的myClass(2.0);
c=新myClass(2.0);
s=新mySet()//不必是实际的“设置”
s、 添加(a);
s、 添加(b);
s、 添加(c);
document.write('size:'+s.size+'
'); 写('has(a):'+s.has(a)+'
'); 写('has(b):'+s.has(b)+'
'); 写('has(c):'+s.has(c)+'
'); (共项){ document.write('存储项:'+JSON.stringify(项)+'
');
};
如果
equals
是验证相等性的唯一方法,则实现将永远不会有效,因为向集合中添加新成员将需要实现遍历所有集合成员并调用
equals
将新项与每个成员进行比较。相反,使用
valueOf
方法是一种选择吗?@trincot这是有道理的。我对JS还是很陌生,所以我不熟悉
valueOf
(这只是
myClass
的返回值吗?)。无论哪种方式,
valueOf
肯定是一个选项,如果我可以为我创建的任何类定义我想要的。好的,我将按照这些思路准备一个答案,然后您可以决定它是否适合您的需要。谢谢!两个后续问题:1)由于此实现使用valueOf,这是否也适用于
myClass
?2) 这个实施有效吗?不客气。不知道你在问什么。如果您的意思是说ES6 Set实现使用valueOf:则情况并非如此。至少当我尝试时它不是这样工作的(在测试用例中大小是3)。ES6MAP的实现也是如此。是的,对不起,这就是我的意思。我只是想找到一个Map实现,让我使用您提出的解决方案。您是否知道由每个添加项的valueOf()设置键的映射实现?映射存储键/值对。如果希望键是值的valueOf,那么这正是我在
mySet
中所做的,只是您没有显式地向它提供
valueOf()
结果,因为它自己会这样做。但是在内部,映射确实得到了这个键/值对:
item.valueOf()/item
。但是,也许我误解了你?或者,如果你的意思是你真的想要这样的解决方案,但完全解决了所有的方法和属性,你可以期待:不,我不知道这样的实现,但你可以添加到这个你需要的。我刚刚添加了迭代器,这样您就可以为。。。这类集合上的循环。