Tôi có một đối tượng có cặp giá trị thay thế được sử dụng để mã hóa/giải mã đơn giản (không phải để bảo mật, chỉ để thuận tiện;). Nó ở dạngJavascript: Giá trị tra cứu nhanh chóng trong đối tượng (như chúng ta có thể với thuộc tính)
var obj = {x: y,
x: y,
...
};
trong đó 'x' là giá trị khi được mã hóa và 'y' là giá trị được giải mã.
Giải mã rất đơn giản: Tôi lặp qua các ký tự của chuỗi và tra cứu giá trị charAt(i)
trong đối tượng qua ngoặc đơn: obj[ str.charAt(i) ]
. (Tôi bỏ qua kiểm tra để xem liệu chúng ta cần một phiên bản chữ hoa hay chữ thường (tất cả các khóa/giá trị trong đối tượng là chữ thường), nhưng đơn giản là đủ.)
Để mã hóa, tất nhiên tôi phải tìm kiếm giá trị trong đối tượng, chứ không phải thuộc tính. Hiện tại, tôi đang lặp qua các thuộc tính với vòng lặp for ... in ...
và kiểm tra các giá trị so với giá trị charAt(i)
. Mã hiện tại của tôi là:
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);
Tôi thật sự cảm thấy cần phải có cách hiệu quả hơn để thực hiện việc này. (Tất nhiên có một đối tượng được đảo ngược, {y: x}, là một lựa chọn. Nhưng không phải là một lựa chọn tốt.) Đây có phải là cách tốt nhất, hay là tốt hơn? Về bản chất, tôi rất muốn có thể làm var prop = obj[value]
giống như tôi có thể làm var value = obj[prop]
.
Có! Tôi sẽ upvote bạn hai lần nếu tôi có thể, vì điều này kết hợp cả hai cải tiến được đề xuất thành một. Điều này chắc chắn là câu trả lời được chấp nhận của tôi (chặn bất kỳ phiên bản tuyệt vời nào khác ...). Cảm ơn! –