gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:52:35 25 4
gpt4 key购买 nike

我目前需要临时交换 JavaScript 字符串中的值,因此我需要有一个双向映射/哈希。

例如,假设我想将 \* 更改为 __asterisk__ (这只是一个示例,这不是我真正想要做的)。我必须能够将 * 映射到 __asterisk__ (以交换原始字符串中的值),但随后我还必须能够映射__asterisk__ 返回到 *(以获取原始字符串)。

这是我正在寻找的一些快速伪代码,以便您可以更好地理解它:

var myString = 'this is \* a test';

// ???
var twoWayMap = new TwoWayMap('*' <---> '__asterisk__', '%' <---> '__percent__', ...);

var newString = myString.replace(/\\(.)/g, function(m, c) {
return twoWayMap.getKey(c);
});
// newString is now 'this is __asterisk__ a test'

// ... later in the code ...

var oldString = newString.replace(/__([^_]+)__/g, function(m, c) {
return twoWayMap.getValue(c);
});
// oldString is now 'this is * a test'

这是我到目前为止所考虑和尝试过的:

var twoWayMap = {'*': '__asterisk__', '%': '__percent__', ...};

// getKey would be like this:
twoWayMap[c];
// getValue would be like:
var val; for (var x in twoWayMap) { if (twoWayMap[x] === c) { val = x; break } }

这样做的明显问题是,按值获取的方式太复杂了,我不想每次必须反向查找时都写出整个内容。

我只是想知道:有没有办法解决这个问题而不需要循环遍历对象?如果没有,有什么方法可以让它更容易或更干净吗?

最佳答案

具有用于反向映射的额外内部对象。最好添加一个实用程序类;)如下所示:

ES6 语法(向下滚动查看 ES5 语法)

class TwoWayMap {
constructor(map) {
this.map = map;
this.reverseMap = {};
for(const key in map) {
const value = map[key];
this.reverseMap[value] = key;
}
}
get(key) { return this.map[key]; }
revGet(key) { return this.reverseMap[key]; }
}

然后你像这样实例化:

const twoWayMap = new TwoWayMap({
'*' : '__asterisk__',
'%' : '__percent__',
....
});

最后,使用它:

twoWayMap.get('*')   //Returns '__asterisk__'
twoWayMap.revGet('__asterisk__') //Returns '*'

奖励:如果您还需要设置/取消设置方法,您可以轻松地完成(在类内部),如下所示:

set(key, value) { this.map[key] = value; }
unset(key) { delete this.map[key] }
// same for revSet and revUnset, just use this.reverseMap instead

与 ES5(旧 js)语法等效:

function TwoWayMap(map) {
this.map = map;
this.reverseMap = {};
for(var key in map) {
var value = map[key];
this.reverseMap[value] = key;
}
}
TwoWayMap.prototype.get = function(key){ return this.map[key]; };
TwoWayMap.prototype.revGet = function(key){ return this.reverseMap[key]; };

用法相同:

var twoWayMap = new TwoWayMap({
'*' : '__asterisk__',
'%' : '__percent__',
....
});
twoWayMap.get('*') //Returns '__asterisk__'
twoWayMap.revGet('__asterisk__') //Returns '*'

希望这有帮助。干杯

关于javascript - 如何在 JavaScript 中创建双向映射,或以其他方式交换值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21070836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com