繁体   English   中英

使用For-Loop从字符串中删除最后一个字符(如果是“!”)-JavaScript

[英]Remove Last Character From String If It's a “!” Using For-Loop - JavaScript

我有

function remove(s) {

    for (i = 0; i < s.length; i++) {

        let lastChar = s.slice(-1);

        if (lastChar === "!") {
            s = s.substring(0, s.length - 1);
        }
        else {
            return s;
        }
    }
  return s;
}

这通过了105次测试,但在代码战中没有通过1

失败的测试是:

Expected: '\\'isl\\'', instead got: '\\'isl!\\''当(s)为"isl!!!!!"Expected: '\\'isl\\'', instead got: '\\'isl!\\''

我不知道为什么在这种情况下没有删除字符串中的最后一个字符。

只要有,它就应该删除字符串中的最后一个字符!

if (lastChar === "!") {
            s = s.substring(0, s.length - 1);
        }

我也尝试过:

s = s.replace("!", "");

但结果相同。 有任何想法吗?

因为您要增加i并在每个循环中检查i < s.length 有时,您删除了! (因此缩短了字符串),而i等于s.length而您从不检查最后一个字符。

没有理由为i所有。 (或者是for循环,但是如果这是挑战中的要求...)

如果使用调试器逐步解决问题,则会发现问题。 使用console.log该版本还显示了问题:

 function remove(s) { for (i = 0; i < s.length; i++) { let lastChar = s.slice(-1); if (lastChar === "!") { s = s.substring(0, s.length - 1); console.log(`i = ${i}, s = '${s}', s.substring(i) = '${s.substring(i)}'`); } else { console.log(`returning '${s}'`); return s; } } console.log(`returning '${s}' at end, because ${i} >= ${s.length}`); return s; } remove("isl!!!!!"); 
 .as-console-wrapper { max-height: 100% !important; } 

您无需使用for循环即可执行此操作。

const stringRemover (str) => {
  if (str[str.length-1] === "!") {
    return str.slice(0,str.length-1);
  } else {
    return str;
  }
}

您可以创建一个递归函数,并使用CharAt检查最后一个char是否为! 如果是这样,则再次调用相同的函数,但要使用删除最后一个字符串后创建的新字符串!

如果需要最后一个字符,则不确定为什么需要for

 function remove(str) { let getLastChar = str.charAt(str.length - 1); if (getLastChar === '!') { return remove(str.substring(0, str.length - 1)) } else { return str; } } console.log(remove("isl!!!!!")); 

这是代码战的结果

这是 密码战 结果

如上一个答复中所述,在for循环的每次迭代中都会检查i < s.length 尝试这个 :

function remove(s) {

    let a = s.length;

    for (i = 0; i < a; i++) {

        let lastChar = s.slice(-1);

        if (lastChar === "!") {
            s = s.substring(0, s.length - 1);
        }
        else {
            return s;
        }
    }
  return s;
}

@TJ Crowder向我指出了正确的方向,但是他没有提供符合我原始逻辑的答案(在这种情况下,我想使用一个for循环)。

关键要点是s = s.replace("!", ""); i--s = s.replace(/!+$/g, '')将在i++时工作。 因为据我所知, replace()方法仅替换字符串的第一次出现,因此我们需要i--强制循环向后遍历字符串,以确保每次出现"!" 被替换。

即这将工作:

function remove(s) {

    for (i = 0; i < s.length; i--) {

        let lastChar = s.slice(-1);

        if (lastChar === "!") {
            s = s.replace("!", '')
        }
        else {
            return s;
        }
    }
    return s;
}

这也将起作用:

function remove(s) {

    for (i = 0; i < s.length; i++) {

        let lastChar = s.slice(-1);

        if (lastChar === "!") {
            s = s.replace(/!+$/g, '');
        }
        else {
            return s;
        }
    }
    return s;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM