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

标签 javascript object loops lookup

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

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 value = obj[prop] 一样执行 var prop = obj[value]

最佳答案

预先只循环一次以创建反向映射会更有效:

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)

您将执行 map.length + str.length 操作,而不是执行 str.length * map.length

关于Javascript:快速查找对象中的值(就像我们可以使用属性一样),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10974493/

相关文章:

javascript - 删除功能不起作用 像这样的错误 JSON 解析错误 : Unexpected identifier "Param"

Java面试: for loop,对象/类引用和绑定(bind)限制

php - 克隆如何创建单例的新版本?

c - 如果用户没有输入正确的值,使 C 程序返回开始并再次要求输入

vba - 如何在 VBA 中查找多个字符串

javascript - auth.signOut() 或signOut(auth)。它们之间有什么区别或主要优点吗?

javascript - 删除文本开头的前导点

r - 在 R 中制作 "dropdown"函数

javascript - React Router v4 不渲染组件

javascript - 如何在 Javascript 中更新深度嵌套的对象?