Javascript: быстрый поиск значения в объекте (как мы можем это сделать со свойствами)

У меня есть объект, который имеет пары замещающих значений, используемых для простого кодирования/декодирования (не для безопасности, просто для удобства; слишком сложно, чтобы объяснять все это здесь). Он имеет форму

var obj = {x: y,
           x: y,
           ...
          };

, где «x» — это значение при кодировании, а «y» — это декодированное значение.

Декодирование простое: я перебираю символы строки и ищу значение charAt(i)в объекте через скобки: obj[ str.charAt(i) ]. (Я опускаю проверку, чтобы увидеть, нужна ли нам версия в верхнем или нижнем регистре (все ключи/значения в объекте в нижнем регистре), но это достаточно просто.)

Чтобы закодировать, мне, конечно, нужно искать значение в объекте, а не в свойстве. В настоящее время я перебираю свойства с помощью цикла for... in... и проверяю значения по значению charAt(i). Мой текущий код:

var i, j,
    output = '',
    str = 'Hello World!',
    obj = {'s':'d',
           'm':'e',
           'e':'h',
           'x':'l',
           'z':'o',
           'i':'r',
           'a':'w',
           'o':'!',
           '-':' '};
for (i = 0; i < str.length; i++) {
    for (j in obj) {
        if (Object.prototype.hasOwnProperty.call(obj, j) &&
            Object.prototype.propertyIsEnumerable.call(obj, j)) {
            if (obj[j] === str.charAt(i)) {
                output += j;
                break;
            } else if (obj[j].toUpperCase() === str.charAt(i)) {
                output += j.toUpperCase();
                break;
            }
        }
    }
}
alert(output);

Я врожденно чувствую, что должен быть более эффективный способ сделать это. (Конечно, иметь перевернутый объект {y:x} можно.Но не хороший.) Это лучший способ, или есть лучше? По сути, я хотел бы иметь возможность сделать var prop = obj[value]точно так же, как я могу сделать var value = obj[prop].

6
задан Marcus Hughes 11 June 2012 в 04:25
поделиться