[英]Don't understand why replace() method is not working as expected
解決以下問題:
創建一個名為alienLanguage
的函數,其中輸入將為str
,輸出應大寫除每個單詞的最后一個字母以外的所有字母
alienLanguage("My name is John")
應該返回"My NAMe Is JOHn"
這是我編寫的代碼:
function alienLanguage(str){
var words = str.toUpperCase().split(' ').map(function (a) {
return a.replace(a[a.length - 1], a[a.length - 1].toLowerCase())
});
return words.join(' ');
}
除以下內容外,所有示例測試用例均適用:
Expected: '\'THIs Is An EXAMPLe\'', instead got: '\'THIs Is An eXAMPLE\''
為什么eXAMPLE
的e變成小寫? 一切都不應該自動變為upperCase嗎?
編輯:我剛剛意識到,有2個e
,第一個被替換。 如何替換最后一個e
? 並且不是已經指定了最后一個字符嗎?
還沒有指定最后一個字符嗎?
不,您只指定了要替換的字符,而不是要替換的字符。 replace
在字符串中搜索表達式。
如何替換最后一個e?
完全不使用replace
。 無論如何,它確實會構造一個新的字符串,您可以輕松地做到這一點:
function alienLanguage(str) {
return str.split(' ').map(function(a) {
return a.slice(0, -1).toUpperCase() + a.slice(-1).toLowerCase();
}).join(' ');
}
您還可以使用replace
,但可以將其與正則表達式一起使用:
function alienLanguage(str) {
return str.toUpperCase().replace(/.\b/g, function(last) {
// ^^^^^^ matches all characters before a word boundary
return last.toLowerCase();
});
}
您無需將字符串拆分為單詞。 只需在正則表達式中使用正向超前斷言 ,即可將所有字母緊隨其后的另一個字母大寫,如下所示:
function alienLanguage(str){
return str.replace(/(\w)(?=\w)/g, l => l.toUpperCase())
}
replace()
使用模式(或正則表達式)進行搜索,它將替換所有出現的情況。
相反,您想截斷並創建一個新的字符串,這在其他語言中稱為賦值(但是JS中的字符串是不可變的)。 有關更多詳細信息,請參見此處 。
您可以使用substring
。 您的replace
替換並替換單詞中最后一個字符的第一個出現-絕對是您要的內容:
function alienLanguage(str){
var words = str.toUpperCase().split(' ').map(function (a) {
return a.length ? a.substring(0, a.length - 2) + a[a.length - 1].toLowerCase() : a;
});
return words.join(' ');
}
正如@TatsuyukiIshi所說,您需要更改對replace()
的使用以進行常規分配。 為了獲得更多幫助,這是您的alienLanguage
函數的更新版本:
function alienLanguage(str){
return str.toUpperCase().split(' ').map(function(word) {
return word.slice(0, -1) + word.substr(-1).toLowerCase()
}).join(' ')
}
在這里擺弄
額外說明:
word.slice(0,-1)
返回單詞減去最后一個字符。
word.substr(-1)
返回最后一個字符作為字符串。
.map()
返回一個數組,因此您可以直接在結果上調用join()
。
無需搜索字母,只需將字符串的大寫部分連接到最后一個字母,再將其轉換為小寫的最后一個字母即可。
這應該可以解決問題:
function alienLanguage(str) {
return str.split(' ').map(function(a) {
return a.slice(0, -1).toUpperCase() + a.slice(-1).toLowerCase();
}).join(' ');
}
試試吧。
function alienLanguage(str){
var words = str.toUpperCase().split(' ').map(function (a) {
return a.substr(0, a.length - 1) +a[a.length - 1].toLowerCase() + a.substr(a.length - 1 + 1);
});
return words.join(' ');
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.