Javascript 为什么字符串中的非空格元素不是';t改为大写

Javascript 为什么字符串中的非空格元素不是';t改为大写,javascript,algorithm,Javascript,Algorithm,我想写一个函数,将偶数索引处的字符串中的字符改为大写。我不想让我的程序将空格计算为偶数索引,即使它落在偶数索引上 例如:“这是一个测试”=>“这是一个测试” 我最初有这个解决方案,但在计算偶数索引时,我无法让它忽略空格字符 function toWeirdCase(string) { return string.split("").map((x,i) => i%2=== 0 && x!== " " ? x.toUpperCase() : x).join("") }

我想写一个函数,将偶数索引处的字符串中的字符改为大写。我不想让我的程序将空格计算为偶数索引,即使它落在偶数索引上

例如:“这是一个测试”=>“这是一个测试”

我最初有这个解决方案,但在计算偶数索引时,我无法让它忽略空格字符

function toWeirdCase(string) {

return string.split("").map((x,i) => i%2=== 0 && x!== " " ? x.toUpperCase() : x).join("")

}

这是我的第二次尝试,我不知道为什么字符串元素实际上没有变为大写。在此方面的任何帮助都将不胜感激。它只是返回原始字符串

function toWeirdCase(string) {
  let indexCount = 0;
  let isSpace = false;

  for (let i = 0; i < string.length; i++) {
    if (string[i] === " ") {
      isSpace = true;
    }
    if (indexCount % 2 === 0 && !isSpace) {
      string[indexCount] = string[indexCount].toUpperCase();
    }
    indexCount++;
    isSpace = false;
  }

  return string;
}
函数类型(字符串){
设indexCount=0;
让isSpace=false;
for(设i=0;i
javascript中的字符串是不可变的,因此您需要执行以下操作:

let test='这是一个测试';
试验=塔箱(试验)//在这里指定结果
下面是一个示例解决方案,它忽略了计数中的空格

函数类型(字符串){
让计数=0;
返回字符串.split(“”).map((x)=>{
如果(x!==“”)
计数++;
if(计数%2==0)返回x.toUpperCase();
否则返回x;
}).join(“”)
}
让test='这是一个测试';
试验=塔箱(试验);

控制台日志(测试)//这是一个测试
您可以倒带单个单词的索引计数器

函数类型(字符串){
返回数组
.来自(
一串
(i=>x=>(/[a-z]/i.test(x)?i++:(i=0))%2?x:x.toUpperCase()
(0)
)
.加入(“”);
}

log(TowerdCase(“这是一个测试”);//这是一个测试“
您可以这样实现:

const str=“这是一个测试”;
功能盒(str){
返回str.split(“”).map(word=>(
[word].map((c,i)=>i%2?
c、 toLowerCase():
c、 连接(“”)。连接(“”);
}

控制台日志(TowerdCase(str))就像前面提到的注释一样,Javascript中的字符串是不可变的。也就是说,您可以将输入字符串分解为空白,进行转换,然后重新连接成一个字符串,类似这样-

function-towerd-case(句子){
返回判决
.拆分(“”)
.map(word=>word
.拆分(“”)
.map((c,i)=>i%2?c:c.toUpperCase())
.join('').join('');

}
您可以在函数范围内存储变量中的空格数

函数类型(字符串){
设spaceCount=0;
//个人偏好:我喜欢reduce fn,但map也可以实现类似的效果
返回字符串.split(“”).reduce((值、字母、索引)=>{
如果(字母=='')空格计数++;
返回值+=((索引-空格计数)%2)
?信件
:letter.toUpperCase();
},'')
}
如果包含空间计数的索引除以2时有余数,则返回leter。

答案: 您可以使用修改后的
reduce
函数,该函数将闭包用作字符计数器。这样做的好处是一次完成转换:

["", ...str].reduce((n => 
     (r, c) => r += /\s/.test(c) ? c : c[`to${n++ & 1 ? "Lower" : "Upper"}Case`]())(0)
);

例子:
const biUpperCase=str=>
(r,c)=>r++=/\s/.test(c)?c:c[`to${n++&1?“Lower”:“Upper”}Case`](0)
);
设test=biUpperCase(“这是一个测试”);

控制台日志(测试)不能修改字符串原语值。字符串在JavaScript中是不可变的(与许多语言一样)。一定要经常在办公室工作!旁注;您的预期结果不会发生在简单的%2检查中。
I
将被小写,因为它位于位置5。@Taplar简单的%2将与自定义计数器一起工作,而不是索引。嗨,尼娜!我想你可能想用
index++
而不是
++index
?否则,最初的小写字符将被封顶,或者,如果字符串的第一个字符是小写的,它将反转大小写:)另外-有趣的是,我实际上使用了闭包/缩减模式,我在您之前的一个答案中一开始不理解它,并在我对这个问题的回答中使用了它。所以谢谢哈哈。