Javascript: 替换字符串中重复的字符?
Javascript: Replace repeated character in a string?
我一直在解决 codewars 上的 katas,我偶然发现了一个我似乎找不到答案的一般代码问题。
这是我的代码:
function wave(str) {
let arr = [];
for (var i = 0; i < str.length; i++) {
str[i].match(/\S/) && arr.push(str.replace(str[i], str[i].toUpperCase()));
}
return arr;
};
(注意:输入始终为小写。)
在 wave("abc def");
的情况下,代码完全符合我的要求:
["Abc def", "aBc def", "abC def", "abc Def", "abc dEf", "abc deF"]
=> 函数获取一个字符串,将字符串中从 str[0]
开始的一个字母大写,将新单词推送到 arr
,递增 i
并重复过程直到 i < str.length
,然后 returns arr
包含所有结果。
但是,如果我输入 wave("acc def");
,例如,只有第一次出现的字母 c
会 return 大写:
["Acc def", "aCc def", "aCc def", "acc Def", "acc dEf", "acc deF"]
问题:为什么它 'jump' 是 'c' 的第二次出现,我如何定位字符串中某个字符的第二次或第 n 次出现?
当您说 str.replace(str[i], str[i].toUpperCase())
时,您是在说:“将第一次出现的 str[i]
替换为 str[i].toUpperCase()
”,这正是您的程序正在做的事情。
考虑像这样构建新字符串:
str.substring(0, i) + str[i].toUpperCase() + str.substring(i+1)
str.replace("x", "y")
将 str
中第一次出现的 "x"
替换为 "y"
如果字符串中只有唯一字符,则您的方法有效,但是当 "acc def"
中存在重复字符时,它将失败
您可以 .slice()
将字符串分成三部分:
i
左边的部分 -> .slice(0, i)
- 索引
i
处的字符 -> str[i]
- 索引后的剩余部分
i
-> .slice(i + 1)
根据需要修改 str[i]
并使用 .join("")
将它们组合回一个字符串
function wave(str) {
const result = [];
for (let i = 0; i < str.length; i++) {
if (!str[i].match(/\S/)) continue;
result.push([
str.slice(0, i), /* the part left of str[i] */
str[i].toUpperCase(), /* str[i] */
str.slice(i + 1) /* the remaining part right of str[i] */
].join("")) // combine the parts in the array into a string
}
return result;
};
console.log(JSON.stringify(wave("abc def")));
console.log(JSON.stringify(wave("acc def")));
我一直在解决 codewars 上的 katas,我偶然发现了一个我似乎找不到答案的一般代码问题。
这是我的代码:
function wave(str) {
let arr = [];
for (var i = 0; i < str.length; i++) {
str[i].match(/\S/) && arr.push(str.replace(str[i], str[i].toUpperCase()));
}
return arr;
};
(注意:输入始终为小写。)
在 wave("abc def");
的情况下,代码完全符合我的要求:
["Abc def", "aBc def", "abC def", "abc Def", "abc dEf", "abc deF"]
=> 函数获取一个字符串,将字符串中从 str[0]
开始的一个字母大写,将新单词推送到 arr
,递增 i
并重复过程直到 i < str.length
,然后 returns arr
包含所有结果。
但是,如果我输入 wave("acc def");
,例如,只有第一次出现的字母 c
会 return 大写:
["Acc def", "aCc def", "aCc def", "acc Def", "acc dEf", "acc deF"]
问题:为什么它 'jump' 是 'c' 的第二次出现,我如何定位字符串中某个字符的第二次或第 n 次出现?
当您说 str.replace(str[i], str[i].toUpperCase())
时,您是在说:“将第一次出现的 str[i]
替换为 str[i].toUpperCase()
”,这正是您的程序正在做的事情。
考虑像这样构建新字符串:
str.substring(0, i) + str[i].toUpperCase() + str.substring(i+1)
str.replace("x", "y")
将 str
中第一次出现的 "x"
替换为 "y"
如果字符串中只有唯一字符,则您的方法有效,但是当 "acc def"
您可以 .slice()
将字符串分成三部分:
i
左边的部分 ->.slice(0, i)
- 索引
i
处的字符 ->str[i]
- 索引后的剩余部分
i
->.slice(i + 1)
根据需要修改 str[i]
并使用 .join("")
function wave(str) {
const result = [];
for (let i = 0; i < str.length; i++) {
if (!str[i].match(/\S/)) continue;
result.push([
str.slice(0, i), /* the part left of str[i] */
str[i].toUpperCase(), /* str[i] */
str.slice(i + 1) /* the remaining part right of str[i] */
].join("")) // combine the parts in the array into a string
}
return result;
};
console.log(JSON.stringify(wave("abc def")));
console.log(JSON.stringify(wave("acc def")));