Javascript:快速查找对象中的值(就像我们可以使用属性一样)

Mar*_*hes 6 javascript lookup loops object

我有一个对象具有用于简单编码/解码的替换值对(不是为了安全,只是为了方便;太复杂,无法在此解释).它在形式中

var obj = {x: y,
           x: y,
           ...
          };
Run Code Online (Sandbox Code Playgroud)

其中'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);
Run Code Online (Sandbox Code Playgroud)

我天生就觉得应该有一种更有效的方法.(当然有一个反向的对象,{y:x},是一个选项.但不是一个好的.)这是最好的方式,还是有更好的方法?从本质上讲,我希望能够做到var prop = obj[value]就像我能做的那样var value = obj[prop].

Ric*_*asi 5

事先循环一次以创建反向映射效率更高:

var str = "Hello World!",
    output = '',
    map = {
      "s":"d", "m":"e",
      "e":"h", "x":"l",
      "z":"o", "i":"r",
      "a":"w", "o":"!",
      "-":" "
    },
    reverseMap = {}

for (j in map){
  if (!Object.prototype.hasOwnProperty.call(map, j)) continue
  reverseMap[map[j]] = j
}

output = str.replace(/./g, function(c){
  return reverseMap[c] || reverseMap[c.toLowerCase()].toUpperCase()
})

console.log(output)
Run Code Online (Sandbox Code Playgroud)

而不是做str.length * map.length,你将做map.length + str.length操作.