以对象为键的打字稿地图

时间:2020-09-18 02:06:27

标签: javascript typescript ecmascript-6

我正在尝试使用对象作为键来构造一个映射,并且可能会遇到与对象实例相关的问题,并希望在这里获得一些意见。

const x = new Map<{label: string, name: number}, string>();

x.set({label: 'x', name: 122}, 'r');
x.set({label: 'x', name: 122}, 'r1');

我可以看到x填充了两个对象键,而我实际上是尝试更新现有的一个,当然,对此对象的键读取失败。

我的直觉是,键被视为两个不同的对象实例,我有办法实现吗?

1 个答案:

答案 0 :(得分:1)

单独的对象不是===,并且Map可以容纳多个不是===的对象,即使它们包含相同的键和值。

您可以搜索“地图”的各个键,以找到具有相同标签和名称的地图,并进行设置(如果存在):

const x = new Map();

x.set({label: 'x', name: 122}, 'r');

const newVal = 'r1';
const foundObj = [...x.keys()].find(
  key => key.label === 'x' && key.name === 122
);
if (foundObj) {
  x.set(foundObj, newVal);
} else {
  x.set({label: 'x', name: 122}, newVal);
}

console.log(x.get(foundObj));

也就是说,这很冗长。考虑是否可以使用普通对象而不是Map,其键为字符串化对象:

const x = {};

x[JSON.stringify({label: 'x', name: 122})] = 'r'

x[JSON.stringify({label: 'x', name: 122})] = 'r1'

console.log(Object.values(x));

相关问题