Tengo un objeto que tiene pares de valores de reemplazo utilizados para la codificación/decodificación simple (no por seguridad, solo por comodidad, demasiado complicado para explicarlo todo aquí) Está en la formaJavascript: valor de búsqueda rápida en el objeto (como podemos con las propiedades)
var obj = {x: y,
x: y,
...
};
donde 'x' es el valor cuando codifica y 'y' es el valor decodificado.
La decodificación es simple: recorro los caracteres de la cadena y busco el valor charAt(i)
en el objeto mediante corchetes: obj[ str.charAt(i) ]
. (Dejo fuera el cheque para ver si necesitamos una versión en mayúsculas o minúsculas (todas las claves/valores en el objeto son minúsculas), pero eso es bastante simple.)
Para codificar, por supuesto tengo que buscar el valor en el objeto, en lugar de la propiedad. Actualmente, estoy recorriendo las propiedades con un bucle for ... in ...
y comprobando los valores con el valor charAt(i)
. Mi código actual es:
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);
Innatamente siento que debería haber una forma más eficiente de hacerlo. (Por supuesto tener un objeto invertido, {y: x}, es una opción, pero no una buena). ¿Es esta la mejor manera, o hay una mejor? En esencia, me encantaría poder hacer var prop = obj[value]
del mismo modo que puedo hacer var value = obj[prop]
.
¡Sí! Te podría haber votado dos veces si pudiera, ya que combina las dos mejoras sugeridas en una. Esta es definitivamente mi respuesta aceptada (salvo que haya otra versión increíble ...). ¡Gracias! –