我正在尝试编写一个函数-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/

10-09 15:24