如果是“!”,则从字符串中删除最后一个字符使用循环-JavaScript

时间:2019-04-09 15:03:27

标签: javascript string for-loop

我有

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个测试,但在codewars上没有通过1个测试。

失败的测试是:

Expected: '\'isl\'', instead got: '\'isl!\''表示何时(s)为"isl!!!!!"

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

这应该在字符串!时删除字符串中的最后一个字符:

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

我也尝试过:

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

但结果相同。有什么想法吗?

5 个答案:

答案 0 :(得分:3)

因为您要增加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;
}

答案 1 :(得分:1)

您可以在不使用for循环的情况下执行此操作。

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

答案 2 :(得分:1)

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

之后创建的新字符串。

如果需要最后一个字符,则不确定为什么需要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!!!!!"));

这是密码战的结果

这是codewars个结果

答案 3 :(得分:0)

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

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;
}

答案 4 :(得分:0)

@ T.J。 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;
}