在JavaScript中创建双向映射的一种有效方法是使用一个对象来同时维护键到值和值到键的映射。这可以通过构造一个特殊的结构来实现,确保每次添加或修改映射时,都同时更新键到值和值到键的关系。
方法一:使用一个对象维护双向映射
下面是一个例子,展示如何实现这样的双向映射:
javascriptclass 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
对象来分别存储键到值和值到键的映射。
javascriptclass 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 回复