Mam obiekt, który ma pary wartości zastępczych używanych do prostego kodowania/dekodowania (nie dla bezpieczeństwa, tylko dla wygody, zbyt skomplikowane, aby wyjaśnić to wszystko tutaj). To jest w postaciJavascript: Szybko szukam wartości w obiekcie (jak możemy z właściwościami)
var obj = {x: y,
x: y,
...
};
gdzie „x” ma wartość zakodowania i „r” jest wartością dekodowane.
Dekodowanie jest proste: przechodzę przez znaki ciągu znaków i sprawdzam wartość charAt(i)
w obiekcie za pomocą nawiasów: obj[ str.charAt(i) ]
. (Pomijam czek, aby sprawdzić, czy potrzebujemy wersji wielkiej lub małej (wszystkie klawisze/wartości w obiekcie są małe), ale to dość proste.)
Do kodowania, oczywiście muszę szukać wartość w obiekcie, a nie właściwość. Obecnie przeglądam właściwości pętli for ... in ...
i sprawdzam wartości pod kątem wartości charAt(i)
. Mój aktualny kod to:
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);
Jestem przekonany, że powinien istnieć skuteczniejszy sposób robienia tego. (Oczywiście posiadanie odwróconego obiektu, {y: x}, jest opcją, ale niezbyt dobrą.) Czy to najlepszy sposób, czy jest lepszy? Zasadniczo, chciałbym móc zrobić var prop = obj[value]
tak jak mogę zrobić var value = obj[prop]
.
Tak! Zrobiłbym dwa razy, gdybym mógł, ponieważ łączy w sobie obie sugerowane ulepszenia. Jest to zdecydowanie moja akceptowana odpowiedź (poza żadną inną niesamowitą wersją ...). Dzięki! –