可以检查列表包含的库或对象

时间:2017-07-01 04:48:50

标签: javascript json node.js ecmascript-6 set

这个问题是这个问题的延伸: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对象进行子类化。但是,我不知道如何为这种情况做这件事......

2 个答案:

答案 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)