我有一个具有对用于简单的编码/解码的替换值的对象(为了安全,只是为了方便起见没有;过于复杂在这里解释它全部)。 它在形式
var obj = {x: y,
x: y,
...
};
编码和“y”是解码值时其中“x”是值。
解码是简单的:通过字符串的字符我循环,并且查找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]
。
这是更有效的循环只有一次事先创建反向映射:
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
操作。
反向编码器会更有意义,但你可以写一个替换功能没有所有的hasOwnProperty etc.tests。
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
您可以通过编程方式(而不是通过手)创建映射的反向版本,并用它来代替。
var rev = {}
for (key in obj)
rev[obj[key]] = key
如果您正在寻找数组键点击这里。
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;
}