javascript - 如何在集合中找到数组的存在?
问题描述
由于 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
。我是否错过了一些虚假的事实或任何逻辑错误?
笔记:
我不想只匹配字符
"a"
和/或"b"
,我想匹配整个数组["a","b"]
。我正在寻找匹配数组。我只需要内容
相同,元素不必是相同的顺序。
解决方案
您尝试执行的操作将不起作用,因为在 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
推荐阅读
- adafruit-circuitpython - 在键盘矩阵上使用 adafruit_debouncer
- azure - 从 Azure Function 向 RabbitMQ Docker 容器发送消息
- python - 对另一列python中的每个类别执行多个groupby
- python - 如何从 txt 文件中获取写入的数据
- title - 使flexdashboard的标题变粗?
- typescript - 基于泛型上下文中的泛型参数重命名对象属性
- postgresql - Google Cloud - Hippa 合规性 - PgAudit 与 IAM 审核日志
- ruby - 如何使`Shell`(ruby stdlib)`notify`功能静音?
- reactjs - 为什么在我设置它们后获取的数据不填充状态?
- ios - react-native ios build 在 xcode 存档中引发错误“多个命令产生目标'RNVectorIcons'”