javascript - 为什么字符串中的非空格元素不会更改为大写

标签 javascript algorithm

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

例如:'This is a test' => 'ThIs Is A Test'

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

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

最佳答案

回答:

您可以使用修改后的 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 )
  • rArray.prototype.reduce 方法中的累加器。这是我们的 reduce 方法返回的内容。

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

旁白:

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

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


希望对您有所帮助!快乐编码!

关于javascript - 为什么字符串中的非空格元素不会更改为大写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58402863/

相关文章:

c++ - Endianness 和 C API 的 : Specifically OpenSSL

c# - 如何获得一系列时间 block 的所有非重叠排列?

javascript - 在客户端检查上传的文件格式

javascript - 使用 moment.js 支持扩展 knockout.js 映射

javascript - 通过 props React 将 WS 连接传递给 child

java - Java或C++中的递归广度优先旅行函数?

javascript - 从 JavaScript 函数运行 Python 脚本

javascript - word导入后括号的意义是什么

algorithm - MST 的 Cheriton-Tarjan 算法

algorithm - 如何知道排序算法何时完成?