我有一套我已经添加了一个列表。
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一样吗?
答案 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