javascript - 将数字传递给新生成的数组时无法设置未定义的属性

标签 javascript

我正在编写代码,将句子中每个单词的首字母转换为大写,其余转换为小写。当我生成一个新数组 arr 并尝试将一个数字传递给它时,会出现错误。

Cannot set property '0' of undefined.

我不知道为什么会这样。

function titleCase(str) {

  var word = str.split(" ");
  var arr = new Array();

  for(var i = 0; i<word.length; i++){
    arr[i][0] = word[i][0].toUpperCase();
    if(word[i].length>1)
    for(var j = 1; j<word[i].length; j++){
      arr[i][j] = word[i][j].toLowerCase();
    }
  }

  str = arr.join(' ');
  return str;
}

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

非常感谢您的帮助!

最佳答案

arr 开始时是一个空数组,但您尝试引用(并更改其属性)arr[i] 而没有在 arr[ 处创建任何内容i] 首先:

arr[i][0] = word[i][0].toUpperCase();

要调整您现有的代码,在循环内部创建一个数组,更改那个数组,然后在末尾加入它并推送到外部arr:

function titleCase(str) {

  var word = str.split(" ");
  var arr = new Array();

  for (var i = 0; i < word.length; i++) {
    let newWordArr = [];
    newWordArr[0] = word[i][0].toUpperCase();
    if (word[i].length > 1) {
      for (var j = 1; j < word[i].length; j++) {
        newWordArr.push(word[i][j].toLowerCase());
      }
    }
    arr.push(newWordArr.join(''));
  }

  str = arr.join(' ');
  return str;
}

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

但我建议改用正则表达式:将第一个非空格字符放入捕获组,同时将后续非空格字符放入不同的捕获组,然后 .replace 为第一组 .toUpperCase() 和第二组 .toLowerCase():

const titleCase = str => str
  .replace(
    /(\S)(\S*)/g,
    (_, g1, g2) => g1.toUpperCase() + g2.toLowerCase()
  );

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

(\S) - 匹配并捕获单个非空格字符(进入上面的参数 g1)

(\S*) - 匹配并捕获后面的零个或多个非空格字符(进入上面的参数 g2)

关于javascript - 将数字传递给新生成的数组时无法设置未定义的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58245863/

相关文章:

javascript - 用于处理框架的 Jquery 插件

javascript - AngularJs $routeProvider 不支持 MVC

javascript - Node.js "write after end"错误

javascript - 如何防止标签被删除?

javascript - html 内容中的数字不断增加

javascript - 在不更改 HTML 的情况下使用递增的类号创建简单的新父元素

javascript - 如何向 DOM 中动态生成的文本框添加类?

javascript - 如何设置输入文本字段的默认光标属性?

javascript - 移动浏览器中的正文边距问题

javascript - 工作表 : indexOf not finding substring