【发布时间】:2014-01-30 23:47:51
【问题描述】:
我目前需要临时换出 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 } }
这样做的明显问题是按值获取的方法太复杂了,我不想每次必须反向查找时都写出整个内容。
我只是想知道:有没有什么方法可以解决这个问题而不需要循环访问一个对象?如果没有,有什么方法可以让它更容易或更干净?
【问题讨论】:
-
您可以通过键入来指定第一个地图,然后使用初始化代码构建反向地图,这样在运行时您就有了两个方向的地图。
-
@Doorknob 我加了一个答案,我觉得很优雅,请检查一下
-
@EdgarVillegasAlvarado 我知道;我已经投票了。
-
你原来的解决方案还不错,对于非时间关键的东西......
标签: javascript data-structures map