2017-12-27 566 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; 
} 

首先我注意到你正在做单个字符大写来就加入他们都在整个字符串。为什么?我只是把整个字符串直接写成大写。
然后我明白了问题是,当您用惊叹号替换问号时,问题和感叹号现在都只有感叹号,所以如果您尝试用问题替换感叹号,则将全部替换它们。 所以我选择用回调替换问题和感叹号标记,并检查回调如果发生是一个或另一个要正确替换。