首页 > 解决方案 > 如何在集合中找到数组的存在?

问题描述

由于 Javascript 中的 set 能够获取对象,包括数组,我如何找到集合中存在的数组列表?

我尝试了以下代码:

var sello = new Set();
sello.add(["a","b"])
console.log(sello.has(["a","b"])) // outputs false

我假设

sello.has(["a","b"])

应该有输出 true 因为我已经在 set 中添加了确切的数组sello。我是否错过了一些虚假的事实或任何逻辑错误?

笔记:

标签: javascriptset

解决方案


您尝试执行的操作将不起作用,因为在 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

推荐阅读