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