【问题标题】:.toLowerCase() / .toUpperCase() not working.toLowerCase() / .toUpperCase() 不工作
【发布时间】:2020-06-21 11:00:23
【问题描述】:

我正在尝试通过 codewars.com katas 提高 javascript 的水平,但我遇到了一个练习,其中 element[i]=element[i].toLowerCase() 之类的东西根本没有改变任何东西。 我想对我的代码有一些帮助,这是练习的说明,后面是我的代码: (请注意,我对 JS 不是很熟悉,所以代码可能根本不完美)

如果字符串中的每个单词都被认为是标题大小写 是:

  • (a) 大写(即只有单词的第一个字母 大写)或
  • (b) 被认为是一个例外,并且全部小写,除非它是第一个单词,并且总是大写。

编写一个函数,将字符串转换为标题大小写,给定一个可选的异常列表(次要单词)。次要单词列表将以字符串形式给出,每个单词用空格分隔。
您的函数应该忽略次要单词字符串的大小写——即使次要单词字符串的大小写发生更改,它也应该以相同的方式运行。

参数:

  • 第一个参数(必需):要转换的原始字符串。
  • 第二个参数(可选):以空格分隔的次要单词列表,除了字符串中的第一个单词外,必须始终小写。当此参数未使用时,JavaScript/CoffeeScript 测试将通过 undefined

function titleCase(title, minorWords) {
  if(title.length==0){return ""}
  var titlesplit = title.split(" ")
  if(minorWords){
    minorWords=minorWords.split(" ")
  }
  var solutionstring = ""
  titlesplit.forEach(element => myfunction(element,minorWords))
  solutionstring[0] = solutionstring[0].toUpperCase()
  return solutionstring

  function myfunction(element,minorWords){
    var elementlength= element.length
    var i=0
    if(minorWords && minorWords.includes(element)){
      for(i;i<elementlength;i++){
        element[i]=element[i].toLowerCase()
      }
    }else {
      for(i;i<elementlength;i++){
        if(i==0){element[i]=element[i].toUpperCase()}
        else{element[i]=element[i].toLowerCase()}
      }
    }
    if(solutionstring.length==0){solutionstring=solutionstring+element}else{solutionstring=solutionstring+" "+element}
    return
  }
}

【问题讨论】:

  • 你在“myfunction”中返回了什么?
  • 字符串是不可变的。你不能这样做var str = "abc"; str[0] = "d"; - 它不会起作用。
  • 除此之外,您似乎只需要function titleCase(title, minorWords) {return title.toLowerCase().replace(/\w+/g, word=&gt;minorWords &amp;&amp; minorWords.indexOf(word) &gt; -1 ? word : word[0].toUppercase()+word.slice(1));} -- 假设您实际上传入了minorWords 的数组而不是空格分隔的字符串。
  • 为什么function myfunction() titleCase()?为什么它在“之后”return ...

标签: javascript


【解决方案1】:

正如 cmets 中所指出的,字符串在 JavaScript 中是不可变的。 此外,搜索使用地图而不是包含。 同样,您可以看到 JavaScript 中的 Set 是什么,并在此处轻松使用 Set。

添加了 cmets 以便您更好地理解。

function titleCase(title, minorWords) {
    // Use === for comparison
    // Prefer using curly braces even for single statements
    if (title.length === 0) {
        return "";
    }
    var titlesplit = title.split(" ");
    // Maps/Objects give O(1) search compared to arrays O(n)
    // Key,value pairs - similar to dictionary
    var minorWordsMap = {};
    minorWords.split(" ").forEach(i => minorWordsMap[i.toLowerCase()] = true);
    
    var finalWords = titlesplit.map((element, index) => convertCase(element, index));
    finalWords[0] = toPascalCase(finalWords[0]);
    
    return finalWords.join(" ");

    function toPascalCase(s) {
        s = s.split("");
        s[0] = s[0].toUpperCase();
        return s.join("");
    }

    function convertCase(element, index) {
        const lElement = element.toLowerCase();
        // If element is part of exception words, ignore
        if(index !== 0 && minorWordsMap[lElement]) {
            return element;
        }
        // If first element or not in exception list, send Title case
        return toPascalCase(lElement);
    }
}

【讨论】:

  • 谢谢你的回答我学到了很多。它似乎运行完美,除了不在第一位的异常词不会被放入小写,这与您在 convertCase 中的条件有关吗?看到错误:给了title="the QUICK bRoWn fOX", minorWords="xyz fox quick the"。期待“快速棕色狐狸”,但得到“快速棕色狐狸”。
  • 没关系,这只是应该是 lElement 而不是 element 的返回,无论如何谢谢:)
猜你喜欢
  • 2020-06-14
  • 2019-03-30
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
相关资源
最近更新 更多