首页 > 解决方案 > 使用字典中的值对字符串进行编码

问题描述

我正在尝试编写一个函数 -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 的每个字符联系起来,这样只有在该字符出现多次时才会增加它。

标签: javascript

解决方案


一旦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'));


推荐阅读