typescript - 如何通过关键对象获取地图元素?
问题描述
有一个代码:
let a = new Map<{id: number, age: number}, string>();
a.set({id: 1, age: 20}, "1");
console.log(a.get({id:1, age: 20}));
它给了我undefined
,因为添加到地图的对象和寻找的对象不相等。是否可以在地图中制作复杂的键以在何时检索它?
我可以做这个:
let a = new Map<string, string>();
其中 string key 是 concatination: id_age
,但我不喜欢这个,因为它不是很明显
解决方案
对象按引用工作,而不是按值工作。这意味着{ a: 5, b: 6 } !== { a: 5, b: 6 }
您可以做的是创建一个类,该类具有一个equals
按值比较属性的自定义方法,而不是您当前拥有的对象键:
export default class Person {
public id: number;
public age: number;
constructor(id: number, age: number) {
this.id = id;
this.age = age;
}
public equals(obj: any): boolean {
return obj && typeof obj === 'object' && obj.id === this.id && obj.age === this.age;
}
}
然后在您的地图中使用它:
const map = new Map<Person, string>();
map.set(new Person(1, 20), '1');
console.log(map.get(new Person(1, 20)); // '1'
推荐阅读
- github - Ansible 是否有用于分叉 github 存储库的模块?
- java - 使用hibernate从数据库中检索blob并使用jsp显示在网页上
- c++ - 尝试使用 std::visit 和 lambda 表达式从 std::variant 返回值
- regex - 用于在数字列表成员周围环绕一些文本的单行
- android - Firebase 实时子监听器在上传到 Firebase 存储时抛出 SocketTimeoutException
- php - 从一种类型转换为另一种类型时,如何输入 PHP 类型作为参数?
- python - 在张量流中制作单位矩阵
- java - JAVA 评估后缀表达式 - 无法抛出空或无效的表达式
- angular - Angular Material Stepper Oninit 用于在 Step1 本身上调用的所有步骤
- maven - 来自 Travis CI 的 Grails 依赖项失败