aHtuE
A-Hh-Ttt-Uuuu-Eeeee
A-HH-Ttt-Uuuu-Eeeee
该函数接受一个字符串(在本例中为“aHtuE”),输出应为“A-Hh-Ttt-Uuuu-Eeeee”。然而,此示例中的第二个“h”以大写而不是小写显示。我猜这是一个计数问题,但无论我尝试什么,我都不明白。
function accum(s) {
// Fill char with first character in upper case
let char = (s.substring(0, 1)).toUpperCase();
let result = "";
for (i = 1; i <= s.length; i++) {
// Add '-'
result += char + "-";
// Get next char
char = s.substring(i, i + 1)
// For counting char
for (j = 1; j <= i; j++) {
// For putting each first new char in upper case
if (j === 1) {
char = char.toUpperCase();
result += char;
}
// else lower case
else {
char = char.toLowerCase();
result += char;
}
}
}
// Remove last '-' char and return result
return result.substring(0, result.length - 1);
}
console.log(accum("aHtuE"))
split
、map
和 join
来执行此操作,如下所示:
let str = "aHtuF"
const result = str
.split("")
.map((ch, i) => `${ch.toUpperCase()}${Array(i).fill(ch.toLowerCase()).join("")}`)
.join("-")
console.log(result);
或
let str = "aHtuF"
const result = str
.split("")
.map((ch, i) => `${ch.toUpperCase()}${ch.toLowerCase().repeat(i)}`)
.join("-")
console.log(result);
当您进入循环的下一次迭代时,您还会将前一个
char
添加到结果中。对于 H
,这仍然是大写 H
,因为对于 H
,您从未进入将其转换为小写的分支,因为对于 H
,外循环索引 i == 1
,因此,您的 j
不会得到 > 1
...
修复很简单:在外循环的同一迭代中添加正确数量的相应字符...请参阅代码中的
//********
注释以了解更改
function accum(s) {
let char = (s.substring(0, 1)).toUpperCase();
//******************************
//Initialize the result with the first character
let result = char;
//*******************
//don't need an extra loop iteration here
for (i = 1; i < s.length; i++) {
//***********************************
// Add only '-' here instead of also the previous char
result += "-";
char = s.substring(i, i + 1)
//**********************************************************
//Add the correct count of the current char to the result
for (j = 0; j <= i; j++) {
//*****************
//Of course need to adapt the condition here
if (j === 0) {
char = char.toUpperCase();
result += char;
}
else {
char = char.toLowerCase();
result += char;
}
}
}
//**************************
//no need to remove anything from result
return result;
}
console.log(accum("aHtuE"))
您还可以稍微简化此代码,如下所示
function accum(s) {
//if s is an empty string or null or undefined
//just return an empty string as result
if (!s) return "";
let
//access character by index and make it uppercase immediately
//initialize result with the first character
result = s[0].toUpperCase();
for (i = 1; i < s.length; i++) {
//add the delimiter and current character as uppercase
result += "-" + s[i].toUpperCase();
//get the current character as lowercase
let char = s[i].toLowerCase();
//add the correct number of lowercase characters
for (j = 0; j < i; j++) {
result += char;
}
}
return result;
}
console.log("aHtuE", accum("aHtuE"))
console.log("foobar", accum("foobar"))
console.log("empty string", accum(""))
console.log("null", accum(null))
console.log("undefined", accum(undefined))
console.log("undefined", accum())