您尝试执行的操作不起作用,因为在 Javascript 中您无法比较这样的数组,即使它们具有相同的值。这是因为数组是引用类型,而不是值类型,对于引用类型,Javascript 根据它们是否引用相同的对象(即内存中的相同位置)来确定它们是否相等。例如,只需尝试:
console.log(['a','b'] == ['a','b']); // false
尽管具有相同的值,但每个数组都是一个新的引用,因此它们彼此不相等。
相比之下,下面代码中的比较确实涉及到等式两边引用同一对象的数组:
let a = ['a','b'];
console.log(a == a); // true
因此:
let sello = new Set();
sello.add(a);
console.log(sello.has(a)); // true
为了解决这个问题,您需要创建一个函数来根据数组的值比较数组。您可以首先检查数组是否具有相同的长度。如果不是,那么它们就不相等。然后,您可以遍历每个项目中的项目,看看任何给定位置是否有任何不同。如果是这样,它们就不相等了。否则,假设您正在处理原始值的平面数组(没有引用类型的嵌套对象),那么数组是相等的。这就是我在下面的“isEqual”中所做的:
function isEqual(x,y) {
if (x.length != y.length)
return false;
for (let i in x)
if (x[i] != y[i])
return false;
return true;
}
如果你愿意,可以测试一下:
console.log(isEqual(['a','b'],['a','b'])); // true
现在,很遗憾,Set.has() 不接受函数,所以我们不能将它与 isEqual 一起使用。但是你可以循环遍历集合的值。如果创建单线是目标,那么我发现的最佳方法是将集合转换为数组并使用some 方法。 some 接受一个计算每一行的函数,如果它对任何一行返回 true,则结果为 true,否则为 false。
console.log(
[...sello].some(item => isEqual(item, ['a','b']))
);
// true