6

単純なエンコード/デコードに使用される置換値のペアを持つオブジェクトがあります(セキュリティのためではなく、便宜上です。ここですべてを説明するには複雑すぎます)。それは形になっています

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]

4

4 に答える 4

6

リバースマップを作成するには、事前に1回だけループする方が効率的です。

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

于 2012-06-11T05:08:50.370 に答える
3

リバースエンコーダーの方が理にかなっていますが、すべての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

于 2012-06-11T04:45:50.587 に答える
2

マッピングの逆バージョンを(手動ではなく)プログラムで作成し、代わりに使用することができます。

var rev = {}
for (key in obj)
    rev[obj[key]] = key
于 2012-06-11T04:30:26.460 に答える
0

配列キーをお探しの場合は、こちらを確認してください。

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;
}
于 2012-06-11T04:39:11.413 に答える