我试图替换用户输入的每个字符,字母前面是15个字母。例如,如果用户输入单词A,那么它将输出“P”。
单词“AB”将输出“PQ”,依此类推每个单词。
我尝试了以下代码,但它无法正常工作。我想循环可能是答案,但如果有人能想到一些更好的想法让我知道。
alphabetArray = ["abcdefghijklmnopqrstuvwyxz"];
function jumpAhead15(aString){
aString.replace(alphabetArray[0][aString + 15]);
}
jumpAhead15("hi");
您可以将字符串视为可迭代并获取一个字符数组,并通过获取索引和偏移量来替换任何字符,并通过字母表长度的其余部分进行调整。
reminder operator %
返回分区的其余部分:
当一个操作数除以第二个操作数时,余数运算符返回剩余的余数。它总是采取红利的标志。
该函数用于保持使alphabet
的字符在有效范围内的索引。例如,通过获取指数20
和15
的有用移位,你得到的35
不是alphabet
的索引。通过使用余数运算符,您将获得9
的值,这是35 / 26 = 1 rest 9
的其余部分
然后返回该字符并将该数组连接到最终字符串。
使用方法:
Array.from
,它接受两个参数,一个可迭代或一个具有length属性和一个mappring函数的对象,为新数组的每个元素调用。 (c
是回调的第一个参数,在这里表示单个字符)Array.from
的回调function jumpAhead15(aString) {
var alphabet = "abcdefghijklmnopqrstuvwyxz";
return Array
.from(
aString,
c => alphabet[(alphabet.indexOf(c) + 15) % alphabet.length]
)
.join('');
}
console.log(jumpAhead15("hi"));
console.log(jumpAhead15("ab"));
使用上面的alphabetArray
,尝试:
aString.split("").map(letter => alphabetArray[(alphabetArray.indexOf(letter) + 15) % 26]).join("");
即:将字符串转换为1个字母的字符串数组,将每个字母更换为15个位置(必要时包装,因此模数运算符%
),然后将字母重新组合成一个字符串。
如果你发现Nina的答案很难理解,那么这个也可能不适合你,但这里有一个基于更通用的字母轮换方案的功能。它还处理案例中的差异:
const rotate = (configs) => (str) => str.split('').map(
c => configs.reduce(
(s, [letters, offset]) => {
const idx = letters.indexOf(s);
return idx < 0 ? s : letters[(idx + offset) % letters.length]
},
c
)
).join('')
const by15 = rotate([
[[...'abcdefghijklmnopqrstuvwxyz'], 15],
[[...'ABCDEFGHIJKLMNOPQRSTUVWXYZ'], 15]
])
console.log(by15('ab')) //~> 'pq'
console.log(by15('aB')) //~> 'pQ'
console.log(by15('Hello, world!')) //~> 'Wtaad, ldgas!'
这与模数运算符使用相同的基本技术,稍微修改以返回原始字符(如果它不在我们的列表中)。我们为每个提供的字母表执行此操作,在本例中为大写和小写字母。这仅在不同的字母表没有重叠时才有效。我们将偏移量与每个字母一起传递,以防万一,例如,将数字旋转3,字母数旋转15.如果您不想这样做,可以将偏移量移出configs
参数(其中)如果它可能被称为alphabets
)并使单个偏移量为rotate
的第二个参数。
注意结构:rotate
是一个箭头函数,它返回一个箭头函数。因此,要从中获取有用的功能,您需要使用字母配置来调用它。返回的函数只接受一个字符串并返回旋转的字符串。
这不是最有效的解决方案,因为您必须遍历每个字母表,即使您已经找到它。由于我不希望它与许多字母表一起使用,这对于相对干净的代码来说似乎是一个很好的权衡。但是人们可以很容易地编写一个搜索过的版本,直到它找到一个包含你的角色的字母表然后处理那个角色。这留给读者练习。