2017-12-27 568 views
0

我需要編寫一個函數來接收一個句子字符串和一個真/假'喊'參數。它應該返回字符串,用驚歎號替換任何問號,反之亦然。如果'喊'是真的,所有的字母應該是大寫的。用感嘆號代替問號

function changeIntonation(str, isShouting) { 
let myString = ''; 
let regExcl = /\!/; 
let regQmark = /\?/; 

let qMarkStr = str.replace(regQmark, '!'); 
let finalStr = qMarkStr.replace(regExcl, '?'); 

let newArr = finalStr.split(''); 

if(isShouting === true) { 
    let upperCaseArr = newArr.map(function(char){ 
    return char.toUpperCase(); 
    }) 
    myString = upperCaseArr.join(''); 
} 
return myString; 

}

我的代碼工作時,我嘗試轉換嘿!你好嗎?嘿,你好嗎?,但是當我測試嘿?你好嗎!它只是使大寫,感嘆號和問號保持不變。 也!??!失敗。 任何想法?謝謝。

+1

想想在失敗的例子中運行代碼時,設置了什麼'qMarkStr'。 – Phylogenesis

+1

您正在將問題轉換爲解釋,然後再回到問題的解釋......您正在改變它,然後您馬上就改變它。你需要一點邏輯來完成這個轉換。 – brso05

+0

如果它已被替換,請不要再替換它... – brso05

回答

2

問題是,當你嘗試用?更換!然後取代?!,你可能會更換,錯誤,原來!?已存在。

要解決這一點,你必須更換!?在一個命令,像(using a function argument on String#replace()):

let finalStr = str.replace(/[!?]/g, function(c) { return c === '?' ? '!' : '?'; }); 

而且你不需要調用.toUpperCase()每個字符,你可以用它字符串:

function changeIntonation(str, isShouting) { 
 
    let finalStr = str.replace(/[!?]/g, function(c) { return c === '?' ? '!' : '?'; }); 
 

 
    if (isShouting === true) { 
 
    return finalStr.toUpperCase(); 
 
    } else { 
 
    return finalStr; 
 
    } 
 
} 
 
console.log(changeIntonation("Hey! How are you?", true)); 
 
console.log(changeIntonation("Hey! How are you?", false)); 
 
console.log(changeIntonation("Hey? How are you!", true)); 
 
console.log(changeIntonation("Hey? How are you!", false));

+0

不錯的答案!國際海事組織如果你打算使用三元語句替換你可能也會使用它來支持它! :) – zfrisch

+2

@zfrisch同意了!如果代碼是我的,我可能會這樣做。我沒有這個時間,因爲我通常嘗試從問題的原始代碼儘可能少地改變代碼。有時候,OP很難弄清楚什麼改變了,哪些沒有改變。 – acdcjunior

+0

啊,我明白了!感謝您的澄清以及:) – squeekyDave

1

您需要同時替換兩個字符。

看看HERE(第二個例子)

1

感謝@acdcj unior,在我之前回答,我沒有注意到他已經回答了!我的代碼看起來像他的,但更緊湊一點。所有的

function changeIntonation(str, isShouting) { 
    str = str.replace(/\?|\!/g, function(match) { 
     return match == "?" ? "!" : "?"; 
    }); 
    return isShouting ? str.toUpperCase() : str; 
} 

首先我注意到你正在做單個字符大寫來就加入他們都在整個字符串。爲什麼?我只是把整個字符串直接寫成大寫。
然後我明白了問題是,當您用驚歎號替換問號時,問題和感嘆號現在都只有感嘆號,所以如果您嘗試用問題替換感嘆號,則將全部替換它們。 所以我選擇用回調替換問題和感嘆號標記,並檢查回調如果發生是一個或另一個要正確替換。