В настоящее время у меня есть необходимость временно менять значения в строке JavaScript, и поэтому мне нужно иметь двунаправленную карту/хэш.
Например, скажем, я хочу изменить \*
на __asterisk__
(это просто пример, это не то, что я на самом деле пытаюсь сделать). Мне нужно будет сопоставить *
с __asterisk__
(чтобы поменять значение в исходной строке), но тогда мне также нужно будет отобразить __asterisk__
на *
(to вернуть исходную строку).
Вот какой-то быстрый псевдоиш-код того, что я ищу, чтобы вы могли понять его лучше:
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 } }
Очевидная проблема заключается в том, что способ получить по значению слишком сложный, и я не хочу, чтобы каждый раз записывать все это каждый раз, когда я должен искать обратный поиск.
Я просто хотел знать: есть ли способ решить эту проблему, не прибегая к переходу через объект? Если нет, есть ли способ сделать это проще или чище?