私はfreecodecampアルゴリズムのチャレンジ "Caesars Cipher"をやっています。私は自分のコードに問題があります。ルックアップテーブルを動的オブジェクトとして生成しようとしましたが、なんらかの理由で登録されませんでした。 console.logを実行しているときは、 "lookup table is undefined"と表示されます。これはAcode変数と同じです。 console.logsをコメントアウトすると動作しますが、strArrのcharがlookupTableに存在するかどうかを調べる以下の部分があるため、何も暗号化しません。そうでなければ、encryptedArrに同じ値を割り当てる必要があります(これはコンマ、スペースなどを暗号化しないようにする):JavaScript動的に作成されたオブジェクトは定義されていません
strArr.forEach(function(thisArg) {
var newValue;
if(lookupTable[thisArg] !== undefined) {
newValue = lookupTable[thisArg];
} else {
newValue = thisArg;
}
encryptedArr.push(newValue);
});
もちろんルックアップテーブル[thisArg]は常に定義されていません。ここ は、同様に上記の部分と全体の関数である。
function rot13(str) { // LBH QVQ VG!
var strArr;
var encryptedArr = [];
var Acode;
var lookupTable = {}; //this object will contain the mapping of letters
var encryptedString;
//check the code of A , this will be a reference for the first letter as the algorith will use Modular Arithmetic
Acode = 'A'.charCodeAt(0);
console.log(Acode);
//generate an object containing mappings (I din't want to do it initially but theoreticaly just making lookups in a table would be more efficiant for huge workloads than calculating it every time)
//this algorithm is a little bit complecated but i don't know how to do modular arithmetic in code properly so I use workarrounds. If a = 101 then I do 101 + the remainder from current letter((Acode + 1) - 13) divided by 26 which works
for (i = 0; i < 26; i++) {
lookupTable[String.fromCharCode(Acode + i)] = String.fromCharCode(Acode + ((Acode + i) - 13) % 26);
console.log(lookupTable[String.fromCharCode(Acode + i)]);
}
//save the string into the array
strArr = str.split("");
//change letters into numbers and save into the code array
strArr.forEach(function(thisArg) {
var newValue;
if (lookupTable[thisArg] !== undefined) {
newValue = lookupTable[thisArg];
} else {
newValue = thisArg;
}
encryptedArr.push(newValue);
});
encryptedString = encryptedArr.join("");
return encryptedString;
}
// Change the inputs below to test
rot13("SERR PBQR PNZC");
console.log(Acode);
私はルックアップテーブルオブジェクトの作成と以下と間違って何をしているのですか?
Acode = 'A'.charCodeAt(0);
'ACODE +((ACODE I +)-13)%26'があることによってそれをシフトした後に、アルファベットの先頭からのオフセットへの弾性係数を適用したいです違う。 'Acode +((i + 13)%26)' – Barmar
'console.log(lookupTable)'を試しましたか? – Barmar
'console.log(strArr)'を実行できますか?その配列の内容が予想よりも異なる可能性があります。 – DBWhite