检查集合是否包含Javascript中的列表

时间:2016-08-15 23:34:29

标签: javascript set ecmascript-6

我有一套我已经添加了一个列表。

var a = new Set();
a.add([1]);

现在我检查[1]中是否存在a

a.has([1]);
> false

基于the spec,可能会发生这种情况,因为如果要比较的两个对象的类型相同:

  

如果x和y引用同一个对象,则返回true。否则,返回   假的。

这也会发生:

[1] == [1]; 
> false

因此Set .has()可能正在使用==来比较相等性(尽管不确定)。 JS中的Set()有一个.contains()方法,就像Java一样吗?

1 个答案:

答案 0 :(得分:-1)

准备好将它与您需要的任何物体一起使用。 您只需要定义如何在函数上比较它们

class SetDeep extends Set {
  constructor (elems){
    super(elems)
  }

  has(elem, compare) {
    if (compare instanceof Function) {
      return Array.from(this).some( setElem => compare(elem, setElem));
    } else {
      return super.has(elem);
    }
  }
}

使用fbohorquez eqArray

function eqArray (a1, a2) {
  if (!(a1 instanceof Array && a2 instanceof Array))
    return false;
  if ( a1.length != a2.length)
    return false;
  for (var i = 0, n=a1.length; i < n; i++) {
      if (a1[i] instanceof Array && a2[i] instanceof Array) {
          if (!eqArray(a1[i], a2[i]))
              return false;
      }
      else if (a1[i] != a2[i])
          return false;
  }
  return true;
}

var a = new SetDeep();
var b = [1];

a.add(b);
a.has(b); // true

var c = new SetDeep();
c.add(b);

c.has([1]); // false
c.has([1], eqA) // true

使用对象:

function equalId (a, b) {
  return a.id === b.id;
}

var objSet = new SetDeep([ { id: 'foo'}, {id: 'bar'} ]);

var foo = {id: 'foo' };

objSet.has(foo); // false;
objSet.has(foo, equalId); // true