输入错误:myArr [i] .splice不是函数

时间:2017-02-07 06:06:29

标签: javascript arrays typeerror splice

我已经多次看到这个问题有关堆栈溢出的问题,但是,我找不到类似的情况来理解问题可能是什么。我有一个基于正则表达式匹配分割的数组。然后我通过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);

5 个答案:

答案 0 :(得分:2)

我认为您收到有关 splice 的消息。 ; - )

您可以使用其他字符串方法,例如 slice substr substring ,它们的工作方式略有不同。您的代码还有其他问题:

  1. 不匹配正确的字符序列以生成大写字符串
  2. 在每次迭代时覆盖 newArr 的值。
  3. 考虑以下具有最小变化的内容:

    ggplot(mydata, aes(mydata$Dia)) +
      geom_histogram(breaks=seq(0, 60, by = 10), col="red",  fill="green",  alpha = .2, bins=6) + 
      ggtitle('title') + 
      xlab('x-label') + ylab('y-label') +
      scale_x_discrete(breaks=seq(0, 60, by = 10), labels=c(890, 880, 870, 860, 850, 840, 830))
    

    或者更嘻哈的事情:

    var sn = "i am done. i want candy! how are you? i am fine.";
    
    function upperCasing(x){
      var myArr = x.match( /[^\.!\?]+[\.!\?] ?/g );
      var newArr = [];
      
      for(var i = 0; i < myArr.length; i++){
        if(/[a-z]/g.test(myArr[i].charAt(0))){
          newArr[i] = myArr[i].charAt(0).toUpperCase() + myArr[i].slice(1);
        }
      }
      console.log(newArr);
    }
    
    upperCasing(sn);

答案 1 :(得分:1)

splice是Array方法,无法在字符串上调用。您可以将字符串转换为数组,将其拼接,然后将其转换回字符串:

let myArray = myArr[i].split('');
myArray.splice(0, 1);
splicedStr = myArray.join('');

答案 2 :(得分:1)

要添加@ bartekfr的答案,请使用子字符串函数。

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

function upperCasing(x){
   var myArr = x.match( /[^\.!\?]+[\.!\?]+/g );
   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].substr(2);
          console.log(newArr);
      }
  }
}

upperCasing(sn)

答案 3 :(得分:1)

您在字符串上使用拼接,其中拼接仅适用于数组

Here You can get more information of splice()

为了您的参考,我也附上我的控制台的截图。

enter image description here

答案 4 :(得分:1)

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

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

如果您尝试在return字符串的开头或空格字符后面替换大写字母后myArr字符串,则可以使用Array.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);