意外的string.replace()结果

时间:2016-10-03 12:48:38

标签: javascript

为什么这会失败?我应该(以某种方式)逃避信i - 这不会与其他角色失败。

titleCase("I'm a little tea pot");

// Prints:   "i'm A Little Tea Pot"
// Expected: "I'm A Little Tea Pot"

function titleCase(str) {
  return str.split(' ').map(function(each) {
    return each.toLowerCase().replace(each[0], each[0].toUpperCase());
  }).join(' ');
}

7 个答案:

答案 0 :(得分:3)

.toLowerCase()发生在each的原始值上,因此.replace()可能/不会给您预期的结果。

如果将其拆分为单独的语句,它应该按预期工作:

function titleCase(str) {
    return str.split(' ').map(function(each) {
        each = each.toLowerCase();
        return each.replace(each[0], each[0].toUpperCase());
    }).join(' ');
}

作为一种更有效的方法,最好将.toLowerCase()移到.map()调用之前,这样只需要调用一次,而不是每个字一次:< / p>

function titleCase(str) {
    str = str.toLowerCase();
    return str.split(' ').map(function(each) {
        return each.replace(each[0], each[0].toUpperCase());
    }).join(' ');
}

答案 1 :(得分:1)

对于“我是”字符串的一部分,大写“I”转换为小写“i”并尝试用大写的“I”替换小写的“i”,这在字符串中甚至不存在。

所以在开头修改了你的函数,用小写字母转换整个字符串。

请查看下面的工作代码段。

console.log(titleCase("I'm a little tea pot"));

// Prints:   "i'm A Little Tea Pot"
// Expected: "I'm A Little Tea Pot"

function titleCase(str) {
  str = str.toLowerCase();
  return str.split(' ').map(function(each) {
    //console.log(each[0].toUpperCase());
    return each.toLowerCase().replace(each[0], each[0].toUpperCase());
  }).join(' ');
}

答案 2 :(得分:1)

您可以尝试这样的事情:

Array.map

function titleCase(str) {  
  return str.split(' ').map(function(each) {
    return each.charAt(0).toUpperCase() + each.substring(1).toLowerCase();
  }).join(' ');
}

console.log(titleCase("I'm a little tea pot"));

Array.reduce

function titleCase(str) {  
  return str.split(' ').reduce(function(p,c) {
    return p + " " + toTitle(c);
  });
}

function toTitle(str){
  return str.charAt(0).toUpperCase() + str.substring(1).toLowerCase();
}

console.log(titleCase("I'm a little tea pot"));

答案 3 :(得分:1)

运行以下代码段并查看输出。

var each ="I'm";

console.log(`Change ${each[0]} to ${each[0].toUpperCase()} in ${each.toLowerCase()}`);
console.log('Result:', each.toLowerCase().replace(each[0], each[0].toUpperCase()));

您应该看到要搜索的字符是大写字母“I”,但字符串中的第一个字符是小写字母“i”。

function titleCase(str) {
  return str.toLowerCase().split(' ').map(function(each) {
    return each.replace(each[0], each[0].toUpperCase());
  }).join(' ');
}

console.log(titleCase("I\'m a little tea pot"));

// Prints:   "i'm A Little Tea Pot"
// Expected: "I'm A Little Tea Pot"

答案 4 :(得分:0)

很简单。

replace(each[0], each[0].toUpperCase());

只会替换lowerCase个项目,而I不会lowercase,因为each[0]尚未被替换。

对于句子中的其他单词,它们的第一个字符是小写的,因此在lowercase()上调用each后它们会保持小写。

答案 5 :(得分:0)

您也可以使用正则表达式。

function titleCase(str) {
 return str.replace(/(?:^|\s)\w/g, function(match) {
        return match.toUpperCase();
    });
}

答案 6 :(得分:0)

toLowerCase返回一个新字符串,它不会更新each的值。因此,当"I'm"分配给each时,您实际获得的是:

"i'm".replace("I", "I".toUpperCase());

"I"不在字符串"i'm"中,因此不会替换任何内容。

不是拆分字符串,而是在每个令牌上运行替换并加入它,而是使用replace RegExpreplacement function来执行此操作:

function titleCase (str) {
  var upper = function (wholeMatch, before, firstLetter) {
      return before + firstLetter.toUpperCase();
    };
  return (str.toLowerCase()).replace(/(^\s*|\s+)(.)/g, upper);
}

titleCase("I'm a little tEa pot");
// "I'm A Little Tea Pot"

titleCase("   I'm a little tEa pot");
// "   I'm A Little Tea Pot"

titleCase(" I'm a little    tEa pot");
" I'm A Little    Tea Pot"

/(^\s*|\s+)(.)/g找到字符串的开头(带有可选的空格)或空格后跟任何单个字符。然后upper函数将字符大写,并返回任何捕获的空格和大写字符作为替换。