簡體   English   中英

不明白為什么replace()方法無法按預期工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM