尝试使用 forEach 将单词的第一个字符大写 [重复]

Posted

技术标签:

【中文标题】尝试使用 forEach 将单词的第一个字符大写 [重复]【英文标题】:Trying to capitalize first character of a word with forEach [duplicate] 【发布时间】:2020-04-16 21:54:57 【问题描述】:

为什么第一个代码块有效(使用 for 循环)而第二个代码块无效(使用 forEach)?

(我试图让字符串中的所有单词都以大写字母开头)

1)

function capitalize(str)
  let wordList = str.split(" ");

  for (i = 0; i < wordList.length; i++)
    wordList[i] = wordList[i][0].toUpperCase() + wordList[i].substring(1);
  ;

  return wordList.join(' ');
;

let str = "How are you doing today?";
console.log(capitalize(str));

2)

function capitalize(str)
  let wordList = str.split(" ");

  wordList.forEach(function(word)
    word = word[0].toUpperCase() + word.substring(1);
  )

  return wordList.join(' ');
;

let str = "How are you doing today?";
console.log(capitalize(str));

【问题讨论】:

word是按值传递给forEach()的回调函数。您没有覆盖数组中的元素。 试试wordList = wordList.map(function(word) return word[0].toUpperCase() + word.substring(1); );反而。或者wordList.forEach(function(word, index, array) array[index] = word[0].toUpperCase() + word.substring(1); ),如果你坚持使用forEach()而不是map() 【参考方案1】:

您可以将String.replace() 与正则表达式一起使用 (regex101):

function capitalize(str) 
  return str.replace(/\b./g, c => c.toUpperCase());
;

const str = "How are you doing today?";

const result = capitalize(str);

console.log(result);

为什么在Array.forEach() 中分配不起作用?

由于 word 是一个字符串(数字或布尔值之类的基元),而 JS 中的基元是不可变的(您无法更改它们,重新分配变量没有效果。此外,值存储在数组中,并且你可以用一种很丑陋的方式改变数组(不推荐。不要使用!),因为JS中的数组是可变的(可以改变)。

function capitalize(str) 
  let wordList = str.split(" ");

  wordList.forEach(function(word, i) 
    wordList[i] = word[0].toUpperCase() + word.substring(1);
  )

  return wordList.join(' ');
;

let str = "How are you doing today?";
console.log(capitalize(str));

【讨论】:

谢谢。我的更好:-P 这是 JS 在 ES2018 之前必须提供的最接近的东西。非常有用。 请注意,同样的建议也适用于工作 for 循环示例。不要修改原始数组..创建一个新的来存储结果【参考方案2】:

您必须使用 .map 而不是 .forEach,因为 map 返回具有更改(映射)值的新数组。

wordList = wordList.map((word) =>
    word[0].toUpperCase() + word.substring(1)
  )

【讨论】:

【参考方案3】:

您仍然可以使用自己的 forEach,更新代码如下, 这里 forEach 的回调将第二个参数作为索引,您可以将修改后的值存储在 wordList 中而不是 word 中。

function capitalize(str)
    let wordList = str.split(" ");

    //console.log(wordList);

    wordList.forEach(function(word, index)
        wordList[index] = word[0].toUpperCase() + word.substring(1);
    )

    return wordList.join(' ');
  ;

  let str = "How are you doing today?";
  console.log(capitalize(str));

【讨论】:

【参考方案4】:

这是解决方案:) 基本上,你忘了更新初始数组。

function capitalize(str)
  let wordList = str.split(" ");
  wordList.forEach(function(word, ind)
    word = word[0].toUpperCase() + word.substring(1);
    wordList[ind] = word;
  )

  return wordList.join(' ');
;

let str = "How are you doing today?";
console.log(capitalize(str));

【讨论】:

【参考方案5】:

forEach 不会修改目标数组,您只是在丢弃分配。您正在寻找的函数是map,它将转换每个值并返回一个新数组。在这种情况下:

function capitalize(s) 
  return s.split(' ').map(w => `$w[0].toUpperCase()$w.substring(1)`).join(' ')


console.log(capitalize('some words'))

【讨论】:

以上是关于尝试使用 forEach 将单词的第一个字符大写 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java如何将每个单词的第一个字符转为大写

PHP - 大写每个单词的第一个字符,除了某些单词

Word VBA大写单词的第一个字符问题

如何在javascript中将字符串的每个单词的第一个字符大写? [复制]

如何使单词的第一个字母大写? [复制]

如何大写字符串中每个单词的第一个字符