簡體   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