尝试使用 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 将单词的第一个字符大写 [重复]的主要内容,如果未能解决你的问题,请参考以下文章