我已经在堆栈溢出问题上多次问过这个问题,但是,我找不到类似的情况来理解问题可能是什么。我有一个基于正则表达式匹配项拆分的数组。然后,我通过for循环运行字符串。如果首字母不大写,则对其执行.toUpperCase。问题是当我尝试将其拼接回时。我能够执行toUpperCase而没有任何问题,但是,toUpperCase之后的拼接使我出现类型错误。有人可以告诉我为什么会有这个问题以及如何解决吗?

var sn = "i am done. i want candy! how are you? i am fine.";

function upperCasing(x){
   var myArr = x.match( /[^\.!\?]+[\.!\?]+/g );
   myArr.splice(0,0);
   for(var i = 0; i < myArr.length; i++){
      if(myArr[i].charAt(1).match(/[a-z]/g)){
          var newArr = myArr[i].charAt(1).toUpperCase() + myArr[i].splice(0,1);
          console.log(newArr);
      }
  }
}

upperCasing(sn);


基于下面提供的答案的工作解决方案,加上我必须添加.trim();。

var sn = "i am done. i want candy! how are you? i am fine.";

function upperCasing(x){
  var myArr = x.match( /[^\.!\?]+[\.!\?]+/g );
  myArr.splice(0,0);
  var newArr = [];
  console.log(myArr);
  for(var i = 0; i < myArr.length; i++){
      //Trimmed unwanted white space caused by the space before each sentence.
      myArr[i] = myArr[i].trim();
      if(myArr[i].charAt(0).match(/[a-z]/g)){
          //Used substr method but changed it to 1 instead of 2
          newArr.push(myArr[i].charAt(0).toUpperCase() + myArr[i].substr(1));
      }
   }
   console.log(newArr.join(' '));
}

upperCasing(sn);

最佳答案

您在不需要返回预期结果的情况下使用Array.prototype.splice()。在newArr循环中将for定义为变量不会从函数调用中返回newArr.splice()可以从Array而不是String删除元素。

另请注意,.charAt(0)在大于myArr的索引中为空格字符。

如果尝试在0的字符串开头替换大写字母后的return字符串或以下空格字符,则可以将myArrArray.prototype.map()String.prototype.replace() RegExp和链/(\s?\w)/一起使用使用参数Array.prototype.join()



var sn = "i am done. i want candy! how are you? i am fine.";

function upperCasing(x){
   var myArr = x.match( /[^\.!\?]+[\.!\?]+/g );
   return myArr.map(function(text) {
     return text.replace(/(\s?\w)/, function(match) {
       return match.toUpperCase()
     })
   }).join("")
}

var res = upperCasing(sn);

console.log(res);

10-04 22:29
查看更多