for循环/在javascript中分配

时间:2019-12-06 10:31:28

标签: javascript

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!"

但是,由于某种原因,并非如此,我认为语句中存在一些问题,在该问题中,我将“文本”重新分配为循环的结果。我想到的是,如果将结果重新分配为将再次通过循环的“文本”,那么我将获得想要的结果。但显然,这是错误的。

您能帮我理解为什么重新分配无法按照我理解的方式进行吗?

1 个答案:

答案 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));