Javascript 可以检查列表包含的库或对象
此问题是此问题的扩展:。我希望能够在nodejs或Javascript中使用类似集合的函数,该函数可以支持检查列表是否属于集合。例如,给定链接中的示例,我希望行为:Javascript 可以检查列表包含的库或对象,javascript,json,node.js,ecmascript-6,set,Javascript,Json,Node.js,Ecmascript 6,Set,此问题是此问题的扩展:。我希望能够在nodejs或Javascript中使用类似集合的函数,该函数可以支持检查列表是否属于集合。例如,给定链接中的示例,我希望行为: var s = new SetWithListCheckingAbility([[1,2], [2,3]]) s.has([2, 3]) true 但是,我找不到任何具有此功能的nodejs库。另一个显而易见的解决方案似乎是JSON序列化添加到set对象中的每个对象,并基于JSON字符串进行检查,因为Javascript等式适用于
var s = new SetWithListCheckingAbility([[1,2], [2,3]])
s.has([2, 3])
true
但是,我找不到任何具有此功能的nodejs库。另一个显而易见的解决方案似乎是JSON序列化添加到set对象中的每个对象,并基于JSON字符串进行检查,因为Javascript等式适用于字符串。这可能需要在ES6中对Set对象进行子类化。然而,我不知道如何做这个案件 您可以做的是将集合中的每个成员转换为字符串格式(看起来是将数字转换为字符串的优雅方式) 例如,如果希望
s.has([3,2])
返回false,因为[2,3]不算作匹配项,那么数组到字符串的转换将类似于array.join(',')
,否则array.sort().join(','))
如果顺序不重要
function setOfListsHasElement(theSet, theElement) {
let newSet = new Set();
theSet.forEach(e => newSet.add(e.join(',')) );
return newSet.has(theElement.join(','));
}
用法示例:
var theSet = new Set();
theSet.add([1,2]);
theSet.add([2,3]);
setOfListsHasElement(theSet, [2,3]); // true
setOfListsHasElement(theSet, [3,2]); // false
setOfListsHasElement(theSet, [2,6]); // false
setOfListsHasElement(theSet, ["1", "2"]); // true - don't know how you want to handle scenarios like this, where the string representation of ["1", "2"] matches that of [1,2]
我想出了如何编写一个自定义类来满足我们的需要:
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)
您的列表是否只包含数字?它将包含数字和字符串。但这将非常慢,因为每次调用函数时都必须重新创建局部变量newSet。这就是为什么我考虑将ES6集合类子类化。