簡體   English   中英

如何使用用戶定義的相等函數在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM