首页 > 解决方案 > 为什么字符串中的非空格元素不会更改为大写

问题描述

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

例如:'这是一个测试' => '这是一个测试'

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

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;
}

标签: javascriptalgorithm

解决方案


回答:

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

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

例子:

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

let test = biUpperCase("This is a Test");

console.log(test);


解释:

  • n是一个字符计数器,用于跟踪所有非空格字符。您可以将其视为仅担心非空格字符的附加索引。
    • 我们使用它来确定字符是偶数还是奇数非空格字符,n & 1方法是执行按位与 ( ) 或执行模运算 ( n % 2)
  • r是方法中的累加器Array.prototype.reduce。这是我们的reduce方法返回的内容。

    • 由于 没有辅助参数Array.prototype.reduce,因此 Array 的第一个索引用作累加器。
      • 这就是我们执行["", ...str]而不是简单的原因[...str]
      • 在语法上我们也可以写成[...str].reduce( fn , "" )代替["", ...str].reduce( fn ),但这会改变我们简洁的代码。
  • c是我们在字符串数组中查看的当前字符。我们RegExp.prototype.match用来确定它是否是一个空格字符。
    • 如果我们只需将空格添加到r(我们累积的字符串)
    • 如果不是,我们将转换后的字符添加到r(我们累积的字符串)
      • 为了确定应该应用哪种大小写转换(大写小写),我们检查n(我们的字符计数器)是偶数还是奇数
        • 如果n++ & 1真的,则情况较低
        • 如果n++ & 1的,那么情况就大了

在旁边:

您会在我提供的代码段和代码中注意到我将您的参数名称字符串更改为str。这样做的原因是因为String是 JavaScript 中的内置构造函数,并且在命名变量时最好不要故意“跨越流”。

在您尝试使用此变量的当前方式中,它没有任何区别,因为它的范围正确,而且说实话,如果您想接受我的建议,这取决于您。请注意,它可能会导致烦人的、无形的问题。


希望这可以帮助!快乐编码!


推荐阅读