javascript - 覆盖 Javascript Map 的相等函数
问题描述
我想在 Javascript 中创建一个 Map(字典),其中键是数字数组,值是某个对象。我想从映射中检索以前使用相同数组内容存储的值 - 即,如果我有一个包含一些内容的数组,我想检索以前为具有相同内容的数组存储的值(如果有的话)。
在大多数其他语言中,这很容易。您将覆盖 Map 的相等函数,以便具有相同内容的两个数组测试相等。这似乎没有可用的Javascript。映射键正在使用 SameValueZero 进行测试,如果它们是同一个对象,它只会认为两个对象相等。
有没有一种方法可以覆盖相等性,或者是否有另一种在 Javascript 中处理这种情况的标准方法?
解决方案
您可以使用 aProxy
更改访问对象属性(也意味着数组元素)的方式。它们允许您通过回调拦截属性获取和设置。
这是一个仅存储两个元素的代理数组的示例,并且无论您要求什么索引都返回这两个元素之一。
const arr = new Proxy([], {
get: function(self, prop) {
const index = parseInt(prop, 10)
// If the property is not a number, then no special handling
if (isNaN(index)) {
return self[prop]
}
if (index % 2 === 0) {
// even
return self[0]
} else {
// odd
return self[1]
}
}
})
// Add just two elements
arr.push('even')
arr.push('odd')
// Get any index
console.log(arr[0]) // even
console.log(arr[1]) // odd
console.log(arr[2]) // even
console.log(arr[301]) // odd
或者,您可以编写自己的类,该类不依赖于拦截基本运算符的“魔术”,而只具有使用您想要的任何逻辑的方法get(key)
。set(key, value)
推荐阅读
- python - 如何在 Python 中获取 Geoclue 地理位置?- 什么是桌面 id 参数?
- docker - Docker:错误:无法访问 jarfile lib/sonar-application-7.6.jar
- php - Why is the use language construct in php unable to see changes in the value of a variable?
- autodesk-forge - 如果用户删除文件,Autodesk Forge 是否会保留数据文件的副本?
- c# - 使用查询过滤器按 id 文件搜索共享驱动器内的文件
- javascript - 在 puppeteer 中将屏幕截图转换为 pdf
- asp.net-core - 从 .NET Core 控制台应用程序提供 Blazor GUI
- javascript - 语音转文字录音
- spring-boot - 是否可以仅基于配置文件加载特定的注释?
- mysql - 我应该编写冗长的 SQL 查询还是分解为几个迭代