我想编写一个函数来将字符串中偶数索引处的字符更改为大写。我不希望我的程序将空格计为偶数索引,即使它落在偶数索引上。
例如:'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
)
- 我们通过执行按位与 (
r 是
Array.prototype.reduce
方法中的累加器。这是我们的reduce
方法返回的内容。- 由于
Array.prototype.reduce
没有第二个参数,数组的第一个索引用作累加器。- 这就是我们执行
["", ...str]
而不是简单地[...str]
的原因。 - 在语法上我们也可以写成
[...str].reduce( fn , "")
而不是["", ...str].reduce( fn )
,但这会改变我们简洁的代码。
- 这就是我们执行
- 由于
- c 是我们在字符串数组中查看的当前字符。我们使用
RegExp.prototype.match
来确定它是否是一个空格字符。- 如果是,我们只需将空格添加到r(我们的累积字符串)
- 如果它不是,我们将转换后的字符添加到 r(我们的累积 字符串)
- 为了确定应该应用哪种大小写转换(upper 或 lower),我们检查是否 n(我们的字符计数器 ) 是偶数 或奇数。
- 如果
n++ & 1
是真实的,则大小写是较低的 - 如果
n++ & 1
是 falsy 则大小写是 upper
- 如果
- 为了确定应该应用哪种大小写转换(upper 或 lower),我们检查是否 n(我们的字符计数器 ) 是偶数 或奇数。
旁白:
您会注意到,在我提供的代码片段和代码中,我将您的参数名称 string 更改为 str。这样做的原因是因为 String 是 JavaScript 中的内置构造函数,最好不要在命名变量时故意“跨流”。
在您尝试使用此变量的当前方式中,它没有任何区别,因为它具有适当的范围,并且说实话,如果您想听取我的建议,这取决于您。请注意,这可能会导致烦人的、不可见的问题。
希望对您有所帮助!快乐编码!
关于javascript - 为什么字符串中的非空格元素不会更改为大写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58402863/