为什么第一个代码块(带有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));
答案 0 :(得分: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));
答案 1 :(得分:0)
您必须使用.map
而不是.forEach
,因为map返回一个具有更改(映射)值的新数组。
wordList = wordList.map((word) =>
word[0].toUpperCase() + word.substring(1)
)
答案 2 :(得分:0)
您仍然可以使用自己的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));
答案 3 :(得分:0)
这是解决方法:) 基本上,您忘记更新初始数组。
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));
答案 4 :(得分:-1)