目前我正在用一些不同的角色替换一个角色,因为它是一个需要改变的乐谱,角色可能会有所不同。因此,我创建了一个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');
});
}
正如你所看到的,C正在改变为D但后来将D改为E,我只想要一个角色进行一次比较。我该怎么做。
答案 0 :(得分:5)
使用一个正则表达式来匹配您要替换的内容,如下所示:
/[A-G](b|#)?/g
即匹配来自A-G的任何字母,可选地后跟b或#。
然后使用.replace()
with a callback查找匹配的内容并返回相应的替换。
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]; });
});
}
展开并运行以下代码段以获得简化演示:
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"))
请注意,使用这样的查找对象还有一个优点,即您可以将其扩展为具有多个对象以允许转置到不同的键中。例如,如果从B大调转换为C#,您应该将D#更改为E#,但如果将F#major转换为Ab,则应将D#更改为F.
答案 1 :(得分:2)
这样做的一个简单方法是用临时值替换初始值,然后再次替换临时变量。
例如:
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', 'e_').replace('D', 'e').replace('D#', 'f')
.replace('Eb', 'f').replace('F', 'g').replace('F#', 'g#')
.replace('Gb', 'a_').replace('G', 'a').replace('G#', 'a#')
.replace('Ab', 'b_').toUpperCase().replace(/[_]/g, "b");
});
}
这将使用小写的“正确”值替换所需的文本,这将阻止下一个管道替换已替换的值。
完成后,您可以浏览字符串并简单地将所有内容设置为大写。所以,只需在上次replace
之后添加。
.toUpperCase().replace(/[_]/g, "b");
显然,你可以使用任何你想要的角色,只要它是唯一的。
$("#btn").on("click", function() {
$("#demo").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', 'e_').replace('D', 'e').replace('D#', 'f')
.replace('Eb', 'f').replace('F', 'g').replace('F#', 'g#')
.replace('Gb', 'a_').replace('G', 'a').replace('G#', 'a#')
.replace('Ab', 'b_').toUpperCase().replace(/[_]/g, "b");
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<b id="demo">AC#Eb</b>
<button id="btn">Convert</button>
答案 2 :(得分:0)
尝试这样的事情
function Dkoord() {
$('[id^=harm] > text:nth-child(1) > tspan:nth-child(1)').text(function(i, text) {
return text.replace('Ab', 'Bb').replace('G#', 'A#').replace('G', 'A')
.replace('Gb', 'Ab').replace('F#', 'G#').replace('F', 'G')
.replace('Eb', 'F').replace('D#', 'F').replace('D', 'E')
.replace('Db', 'Eb').replace('C#', 'D#').replace('C', 'D')
.replace('B', 'C#').replace('Bb', 'C').replace('A#', 'C')
.replace('A', 'B')
});
}