乐闻世界logo
搜索文章和话题

如何在JavaScript中创建双向映射,或以其他方式交换值?

4 个月前提问
3 个月前修改
浏览次数39

1个答案

1

在JavaScript中创建双向映射的一种有效方法是使用一个对象来同时维护键到值和值到键的映射。这可以通过构造一个特殊的结构来实现,确保每次添加或修改映射时,都同时更新键到值和值到键的关系。

方法一:使用一个对象维护双向映射

下面是一个例子,展示如何实现这样的双向映射:

javascript
class BiMap { constructor() { this.keyToValue = {}; this.valueToKey = {}; } set(key, value) { // 删除旧的映射 if (this.keyToValue[key]) { delete this.valueToKey[this.keyToValue[key]]; } if (this.valueToKey[value]) { delete this.keyToValue[this.valueToKey[value]]; } // 设置新的映射 this.keyToValue[key] = value; this.valueToKey[value] = key; } getKey(value) { return this.valueToKey[value]; } getValue(key) { return this.keyToValue[key]; } removeByKey(key) { const value = this.keyToValue[key]; if (value) { delete this.valueToKey[value]; delete this.keyToValue[key]; } } removeByValue(value) { const key = this.valueToKey[value]; if (key) { delete this.keyToValue[key]; delete this.valueToKey[value]; } } } // 使用示例 const biMap = new BiMap(); biMap.set('a', 1); biMap.set('b', 2); console.log(biMap.getKey(1)); // 输出: 'a' console.log(biMap.getValue('b')); // 输出: 2 biMap.set('a', 3); // 更新'a'的值 console.log(biMap.getKey(1)); // 输出: undefined console.log(biMap.getKey(3)); // 输出: 'a'

方法二:使用 Map 对象

如果你想要一个更灵活或内置的数据结构,你可以考虑使用两个 Map 对象来分别存储键到值和值到键的映射。

javascript
class BiDirectionalMap { constructor() { this.keyToValue = new Map(); this.valueToKey = new Map(); } set(key, value) { // 删除旧的映射 if (this.keyToValue.has(key)) { this.valueToKey.delete(this.keyToValue.get(key)); } if (this.valueToKey.has(value)) { this.keyToValue.delete(this.valueToKey.get(value)); } // 设置新的映射 this.keyToValue.set(key, value); this.valueToKey.set(value, key); } getKey(value) { return this.valueToKey.get(value); } getValue(key) { return this.keyToValue.get(key); } removeByKey(key) { const value = this.keyToValue.get(key); if (value !== undefined) { this.valueToKey.delete(value); this.keyToValue.delete(key); } } removeByValue(value) { const key = this.valueToKey.get(value); if (key !== undefined) { this.keyToValue.delete(key); this.valueToKey.delete(value); } } } // 使用示例 const map = new BiDirectionalMap(); map.set('x', 100); map.set('y', 200); console.log(map.getKey(100)); // 输出: 'x' console.log(map.getValue('y')); // 输出: 200

以上两种方法都提供了灵活的双向映射功能,在添加、获取和删除元素时保持映射的一致性。这对于需要快速检索键和值的场景非常有用。

2024年6月29日 12:07 回复

你的答案