[将数字传递给新生成的数组时无法设置undefined的属性

问题描述 投票:1回答:5

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

无法设置未定义的属性'0'。

我不知道为什么会这样。

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");

非常感谢您的帮助!

javascript
5个回答
1
投票

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

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

要调整现有代码,请在循环中创建一个数组[[inside,更改that数组,然后在最后加入它并推入外部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)


1
投票
function titleCase(str) { var word = str.split(" "); var arr = new Array(); for(var i = 0; i<word.length; i++){ let newWord = ''; for(var j = 0; j < word[i].length; j++){ if(j === 0){ newWord += word[i][j].toUpperCase(); } else { newWord += word[i][j].toLowerCase(); } } arr.push(newWord); } str = arr.join(' '); return str; } console.log(titleCase("I'm a little tea pot"));

0
投票
Javascript仅具有一维数组,但是您可以构建数组的数组...

here

titleCase("I'm a little tea pot"); function titleCase(str) { var word = str.split(" "); var arr = new Array(); var arr = [] for (var i=0;i<word.length;i++) { arr[i] = []; } 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; } console.log (titleCase("I'm a little tea pot"));


0
投票
您需要

只显示以您的样式(每个单词中的大写字母)显示此标题,可以使用以下方法进行此操作:

    您可以简单地通过使用css将其存档。
  • #title { text-transform: capitalize; }
    <span id="title">I'm a little tea pot</span>
      如果要通过javascript获得此结果,则需要执行DOM操作。
  • document.getElementById('title').style.textTransform = 'capitalize';
    <span id="title">I'm a little tea pot</span>

  • 0
    投票
    根据您的错误。

    无法设置未定义的属性'0'。

    此错误在arr[i][0] = word[i][0].toUpperCase()发生,因为arr[i]在您的代码段中未定义。

    因此,您需要使用如下所示的arr将新项添加到arr.push()数组中;

    function titleCase(str) { var word = str.split(" "); var arr = new Array(); for(var i = 0; i<word.length; i++){ console.log(`arr[${i}] is ${arr[i]}`); arr.push(word[i][0].toUpperCase()); if(word[i].length>1) for(var j = 1; j<word[i].length; j++){ arr[i] = arr[i] + word[i][j].toLowerCase(); } } console.log(arr); return str; } console.log(titleCase("I'm a little tea pot"));
    © www.soinside.com 2019 - 2024. All rights reserved.