gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:36:55 25 4
gpt4 key购买 nike

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

例如:'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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com