我有一个函数encryptString(string, shift)
。
如果encryptString('c', 1)
,则c
变成d
。
如果参数为encryptString('c', -1)
,则c
变为b
。
如果shift
大于26或小于0,则字母/数字回绕。在encryptString('a', 29)
中,a
的意思是`c。
我相信可以使用charCode()
函数来解决此问题,但是我开始使用reduce
,并希望使用已有的解决方案。
我在下面的尝试可以移动字母和数字,但前提是它们必须在数组长度之内。如果shift
大于26,则不起作用。
我将不胜感激。
const encryptString = (str, shift) => {
if(!str.match(/^[a-z0-9]+$/i)) { throw new Error }
const caps = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
const letters = 'abcdefghijklmnopqrstuvwxyz'.split('');
const numbers = '123456789'.split('');
const reduction = str.split('').reduce((a,b) => {
caps.includes(b) ? b = caps[caps.indexOf(b) + shift] || caps[shift] : null;
letters.includes(b) ? b = letters[letters.indexOf(b) + shift] || letters[shift] : null;
numbers.includes(b) ? b = numbers[numbers.indexOf(b) + shift] || numbers[shift] : null;
a.push(b);
return a;
}, [])
return reduction.join('');
};
其他一些情况:
encryptString('JavaScript', 3) => 'MdydVfulsw' // passes
encryptString('mqblhw', -1) => 'lpakgv' // passes
encryptString('z956qau', 29) => 'c845tdx' //code above fails
encryptString('password123', -266) => 'jummqilx567' // code above fails