我正在尝试编写一个函数-encode(text,keyText)-接受一个字符串,通常是一个单词,并通过更改文本的每个字母以及在keyText中该字母的位置来对其进行编码。
如果一个字母在keyText中多次出现,则在编码过程中应以出现在keyText中的相同顺序使用每次出现的字母。如果它在文本中出现的次数多于返回到第一个字母的次数,则第一个字母被替换为keyText中该字母的位置,如果该字母的第二次出现将替换为keyText中的第二个位置(如果字母第三次出现在文本中,但仅在keyText中出现两次,然后再次被替换为第一名,依此类推。
我还编写了一个函数getKeys,该函数接受一个字符串并返回一个“字典”,该字典给出了该句子中每个字母的位置。
假设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'));
关于javascript - 使用字典中的值编码字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61315101/