function encrypt(text, n) {
let odd = [];
let even = [];
let punc = [];
for(let i = 0; i < n; i++) {
text.split('').forEach((el,i,arr) => {
if(el === '!'||el === '.'||el ==='?'){
punc.push(el);
} else if(i % 2 === 0) {
odd.push(el);
} else {
even.push(el);
}
})
text = even.concat(odd).concat(punc).join('');
}
return text;
}
console.log(encrypt("This is a test!", 1));
你好,我试图通过分隔每个字符,每隔一个字符并将它们放在前面来对字符串输入进行加密,我将执行n次,这是另一个参数。
我现在遇到的麻烦是,如果我们需要加密的数字为1,则上面的代码可以正常工作
"hsi etTi sats!"
但是从2开始,它确实工作异常。
当我输入类似的内容时,
console.log(encrypt("This is a test!", 2));
我希望
"s eT ashi tist!"
但是,由于某种原因,并非如此,我认为语句中存在一些问题,在该问题中,我将“文本”重新分配为循环的结果。我想到的是,如果将结果重新分配为将再次通过循环的“文本”,那么我将获得想要的结果。但显然,这是错误的。
您能帮我理解为什么重新分配无法按照我理解的方式进行吗?
答案 0 :(得分:1)
您需要在n
的每次迭代中将3个数组重置为空数组。
...
text = even.concat(odd).concat(punc).join('');
odd = [];
even = [];
punc = [];
....
此外,您的if
陈述是错误的:
if(el === '!'|'.'|'?')
应该是
if(el === '!'|| el === '.' || el === '?')
下面的工作示例:
function encrypt(text, n) {
let odd = [];
let even = [];
let punc = [];
for(let i = 0; i < n; i++) {
text.split('').forEach((el,i,arr) => {
if(el === '!'|| el === '.' || el === '?'){
punc.push(el);
} else if(i % 2 === 0) {
odd.push(el);
} else {
even.push(el);
}
})
text = even.concat(odd).concat(punc).join('');
odd = [];
even = [];
punc = [];
}
return text;
}
console.log(encrypt("This is a test!", 1));
console.log(encrypt("This is a test!", 2));