Hen*_*ink 2 javascript replace
目前我正在用一些不同的角色替换一个角色,因为它是一个音乐表,需要改变角色可能会有所不同.因此,我创建了一个JavaScript代码,如果在工作表上将替换所有这些字母.
这里出现问题,如果我有字符A需要用C替换,稍后在同一个JavaScript代码中C需要用D代替.因此A改为D而不是C.我需要每个字符替换一次每个字符而不是将替换的文本与其他可能性进行比较.
到目前为止,这是我的代码:
function Dkoord() {
$('[id^=harm] > text:nth-child(1) > tspan:nth-child(1)').text(function(i, text) {
return text.replace('A', 'B').replace('A#', 'C').replace('Bb', 'C')
.replace('B', 'C#').replace('C', 'D').replace('C#', 'D#')
.replace('Db', 'Eb').replace('D', 'E').replace('D#', 'F')
.replace('Eb', 'F').replace('F', 'G').replace('F#', 'G#')
.replace('Gb', 'Ab').replace('G', 'A').replace('G#', 'A#')
.replace('Ab', 'Bb');
});
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,C正在改变为D但后来将D改为E,我只想要一个角色进行一次比较.我该怎么做呢.
使用一个正则表达式来匹配要替换的内容,如下所示:
/[A-G](b|#)?/g
Run Code Online (Sandbox Code Playgroud)
也就是说,匹配来自AG的任何字母,可选地后跟b或#.
然后使用.replace()回调来查找匹配的内容并返回相应的替换.
function Dkoord() {
var replacements = {
'A': 'B', 'A#': 'C', 'Bb': 'C', 'B': 'C#', 'C': 'D', 'C#': 'D#',
'Db': 'Eb', 'D': 'E', 'D#': 'F', 'Eb': 'F', 'F': 'G', 'F#': 'G#',
'Gb': 'Ab', 'G': 'A', 'G#': 'A#', 'Ab': 'Bb'
};
$('[id^=harm] > text:nth-child(1) > tspan:nth-child(1)').text(function(i, text) {
return text.replace(/[A-G](b|#)?/g, function(m) { return replacements[m]; });
});
}
Run Code Online (Sandbox Code Playgroud)
展开并运行以下代码段以获得简化演示:
function Dkoord(text) {
var replacements = {
'A': 'B', 'A#': 'C', 'Bb': 'C', 'B': 'C#', 'C': 'D', 'C#': 'D#',
'Db': 'Eb', 'D': 'E', 'D#': 'F', 'Eb': 'F', 'F': 'G', 'F#': 'G#',
'Gb': 'Ab', 'G': 'A', 'G#': 'A#', 'Ab': 'Bb'
};
return text.replace(/[A-G](b|#)?/g, function(m) { return replacements[m]; });
}
console.log(Dkoord("A# B C D/F# G A"))Run Code Online (Sandbox Code Playgroud)
请注意,使用这样的查找对象还有一个优点,即您可以将其扩展为具有多个对象以允许转置到不同的键.例如,如果从B大调转换为C#,您应该将D#更改为E#,但如果将F#转换为Ab,则应将D#更改为F.
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |