使用字典中的值对字符串进行编码



我正在尝试编写一个函数encode(text,keyText(,它接受一个字符串,通常是一个单词,并通过更改文本中每个字母在keyText中的位置来对其进行编码。

如果一个字母在keyText中多次出现,那么在编码过程中的每一次出现都应该按照它们在keyText的出现顺序使用。如果它在文本中出现的次数比它循环回第一个字母的次数多,那么第一个字母被该字母在keyText中的位置替换,并且该字母的第二个出现被keyText中第二个位置替换,如果该字母在文本中第三次出现,但只在keyText出现两次,那么它将再次被第一个位置替换等等

我还编写了一个函数getKeys,它接受一个字符串并返回一个"dictionary",为每个字母提供句子中的位置。

假设keyText是"And not just the men, but the women and the children, too"

getKeys(keyText(将返回:{"A":[1, 29], "N":[2, 4], "D":[3], "O":[5, 25, 44 ,45] ...}

所以encode("anna",keyText(应该返回这个:

[1,2,4,29]

function encode(text, keyText) {
text = text.toUpperCase();
var key = getKeys(keyText);
var list = [];
var counter = 1;
for(let char of text){
var len = key[char].length;
if(counter > len){
counter = 0;
}
list.push(key[char][counter])
counter++;
}
}return list;

我的代码的明显问题是,计数器会为所有字母递增,而不仅仅是在需要获得第二个或第三个值时。但如果我把计数器放在for循环中,它也不会起作用。我找不到一种方法将计数器与Text的每个字符绑定,这样只有当该字符出现多次时,计数器才会递增。

一旦调用了getKeys,并且您有了一个对象,就需要为对象中的每个属性分别设置计数器。您可以使用keys对象来构造另一个具有相同键的对象,但其值是指示该键的当前计数器的标记。在每个字符迭代中,查找该字符的相关计数器,保存要返回的值,并递增计数器:

function encode(text, keyText) {
// var key = getKeys(keyText);
const keysObj = {"A":[1, 29], "N":[2, 4], "D":[3], "O":[5, 25, 44 ,45] };
const counters = Object.fromEntries(
Object.keys(keysObj).map(key => [key, 0])
);
return [...text.toUpperCase()]
.map((char) => {
const thisCharNumArr = keysObj[char];
const num = thisCharNumArr[counters[char]];
counters[char] = (counters[char] + 1) % thisCharNumArr.length;
return num;
})
}
console.log(encode('anna'));
console.log(encode('annannnnn'));

相关内容

  • 没有找到相关文章

最新更新