我已经多次看到这个问题有关堆栈溢出的问题,但是,我找不到类似的情况来理解问题可能是什么。我有一个基于正则表达式匹配分割的数组。然后我通过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);
答案 0 :(得分:2)
我认为您收到有关 splice 的消息。 ; - )
您可以使用其他字符串方法,例如 slice , substr 和 substring ,它们的工作方式略有不同。您的代码还有其他问题:
考虑以下具有最小变化的内容:
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)
答案 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);