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等式适用于

此问题是此问题的扩展:。我希望能够在nodejs或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集合类子类化。