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

Javascript: Quickly lookup value in object (like we can with properties)

本文关键字:查找 属性 一样 我们 Javascript 对象      更新时间:2023-09-26

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

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)

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

可以通过编程方式(而不是手动)创建映射的反向版本并改用它。

var rev = {}
for (key in obj)
    rev[obj[key]] = key

反向编码器会更有意义,但你可以在没有所有hasOwnProperty等测试的情况下编写一个替换函数。

var str= 'Hello World!',
obj={
    's':'d',
    'm':'e',
    'e':'h',
    'x':'l',
    'z':'o',
    'i':'r',
    'a':'w',
    'o':'!',
    '-':' '
}
str= str.replace(/./g, function(w){
    for(var p in obj){
        if(obj[p]=== w) return p;
        if(obj[p]=== w.toLowerCase()) return p.toUpperCase();
    };
    return w;
});

返回值:(字符串)Emxxz-Azixso

如果您正在寻找数组键,请查看此处。

https://raw.github.com/kvz/phpjs/master/functions/array/array_keys.js

function array_keys (input, search_value, argStrict) {
    var search = typeof search_value !== 'undefined', tmp_arr = [], strict = !!argStrict, include = true, key = '';
    if (input && typeof input === 'object' && input.change_key_case) {
        return input.keys(search_value, argStrict);
    }
    for (key in input) {
        if (input.hasOwnProperty(key)) {
            include = true;
            if (search) {
                if (strict && input[key] !== search_value) include = false;
                else if (input[key] != search_value) include = false;
            }
            if (include) tmp_arr[tmp_arr.length] = key;
        }
    }
    return tmp_arr;
}