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

时间:2019-12-26 18:27:52

标签: javascript arrays foreach

为什么第一个代码块(带有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));

5 个答案:

答案 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)

forEach不执行任何操作来修改目标数组,您只是丢弃分配。您要查找的函数是map,它将转换每个值并返回一个新数组。在这种情况下:

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

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