这个问题是这个问题的延伸:Checking containment in set of lists in javascript。我希望能够在nodejs或Javascript中使用类似函数的集合来支持检查列表是否属于集合。例如,给定链接中的示例,我想要的行为:
var s = new SetWithListCheckingAbility([[1,2], [2,3]])
s.has([2, 3])
true
然而,我无法找到任何具有此功能的nodejs库。另一个明显的解决方案似乎是JSON序列化添加到set对象的每个对象,并根据JSON字符串进行检查,因为Javascript相等适用于字符串。这可能需要在ES6中对Set对象进行子类化。但是,我不知道如何为这种情况做这件事......
答案 0 :(得分:0)
你可以做的是取集合中的每个成员并将其转换为字符串格式(this answer看起来像是从数字到字符串转换的优雅方式。)
对于您的示例,如果您希望s.has([3, 2])
返回false,因为[2,3]不计为匹配,则数组到字符串的转换看起来像array.join(',')
,否则{{1如果顺序无关紧要。
array.sort().join(',')
使用示例:
function setOfListsHasElement(theSet, theElement) {
let newSet = new Set();
theSet.forEach(e => newSet.add(e.join(',')) );
return newSet.has(theElement.join(','));
}
答案 1 :(得分:0)
我想出了如何编写一个符合我们想要的自定义类:
class SetImproved extends Set{
constructor(){
super();
this.classDict = {};
this._size = 0;
}
get size(){
return this._size
}
add(x){
if(!(JSON.stringify(x) in this.classDict)){
this._size += 1;
}
this.classDict[JSON.stringify(x)] = x;
}
has(x){
return JSON.stringify(x) in this.classDict;
}
delete(x){
if(JSON.stringify(x) in this.classDict){
this._size -= 1;
}
delete this.classDict[JSON.stringify(x)];
}
clear(){
this.classDict = {};
}
keys(){
return Object.keys(this.classDict).map(x => this.classDict[x]);
}
entries(){
return Object.keys(this.classDict).map(x => this.classDict[x]);
}
}
功能的一些示例:
var setImproved = new SetImproved()
setImproved.add([1, "b"])
setImproved.add([2, "c"])
setImproved.add(3)
setImproved.add("asdf")
console.log(setImproved.has([1, "b"]))
console.log(setImproved.has([3]))
setImproved.delete([4])
setImproved.delete([1, "b"])
console.log(setImproved.has(3))
console.log(setImproved.entries())
console.log(setImproved.size)