javascript - 使用字典中的值对字符串进行编码
问题描述
我正在尝试编写一个函数 -encode(text, keyText)- 它接受一个字符串,通常是一个单词,并通过更改文本的每个字母以及该字母在 keyText 中的位置来对其进行编码。
如果一个字母在 keyText 中出现多次,那么它应该按照它们在 keyText 中出现的顺序使用编码过程中的每次出现。如果它在文本中出现的次数比它循环回第一个字母的次数多,那么第一个字母被替换为该字母在 keyText 中的位置,并且该字母的第二次出现被替换为 keyText 中的第二个位置,如果letter 在文本中第三次出现,但只在 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'));
推荐阅读
- maven - --mount=type=cache 在 buildkit
- node.js - RangeError [ERR_OUT_OF_RANGE]:“值”的值超出范围。它必须 >= 0 和 <= 4294967295。收到 9433906525
- r - 如何在光滑的游戏中使用时间
- html - 如何为溢出的文本提供最少 2 行的空间?
- android - 如何使用 sqlLite 全外连接
- ubuntu - 如何链接到 LibZip?
- javascript - Javascript Prototype based class in default based class 可以使用吗?
- pytest - 在哪里放置 pytest_generate_tests 钩子
- sql - 如何在SSIS中的每一行中生成具有不同数据类型的固定宽度文件
- html - 用一些空白将它们垂直分开