javascript - 一种编写 for 循环的更短的方法,避免制作太多类似的 if?
问题描述
我想避免为大量项目编写大量代码。例如,我有这个:
let f_a = document.querySelector('#FToneA');
let f_b = document.querySelector('#FToneB');
let f_c = document.querySelector('#FToneC');
// etc...
let fNameList = [f_a, f_b, f_c,]; // etc...
let fToneA = new Audio('../instrumentarium/assets/snd/flute/A_F.wav');
let fToneB = new Audio('../instrumentarium/assets/snd/flute/B_F.wav');
let fToneC = new Audio('../instrumentarium/assets/snd/flute/C_F.wav');
// etc...
let fToneList = [fToneA, fToneB, fToneC,]; // etc...
然后我有每个元素应该发生的事件,即当您将鼠标悬停在一个元素上时播放一个 .wav 文件。
for (var t of fNameList) {
t.addEventListener('mouseover', function() {
function tSet(tone) {
tone.play();
};
if (this === f_a) {
tSet(fToneA);
} else if (this === f_b) {
tSet(fToneB);
} else if (this === f_c) {
tSet(fToneC);
} // etc...
我想要做的类似于你在 Python 中使用 list.index() 做的事情,所以我尝试做的而不是上面的事情如下:
for (var nameIndex of fNameList) {
nameIndex.addEventListener('mouseover', function() {
for (var toneIndex of fToneList) {
if (fNameList.indexOf(nameIndex) === fToneList.indexOf(toneIndex)) {
toneIndex.play();
}
}
})
};
换句话说,在 Python 中它只是 index() 而不是 indexOf()。但我想我在这里做错了什么。最有可能在“toneIndex.play()”上方的那一行。因为我悬停/单击的每个元素只播放一个声音。
谁能帮我正确地写这个?
解决方案
考虑使用数组数组,将每个元素(例如#FToneA
)与相关音频配对,然后在闭包中引用两者:
const audioTonePairs = [
[document.querySelector('#FToneA'), new Audio('../instrumentarium/assets/snd/flute/A_F.wav')],
[document.querySelector('#FToneB'), new Audio('../instrumentarium/assets/snd/flute/B_F.wav')],
[document.querySelector('#FToneC'), new Audio('../instrumentarium/assets/snd/flute/C_F.wav')]
];
for (const [toneElm, audio] of audioTonePairs) {
toneElm.addEventListener('mouseover', () => audio.play());
}
确保使用const
, not var
,以便循环闭合正常工作。
您可能也想构建audioTonePairs
较少重复的内容:
const audioTonePairs = ['A', 'B', 'C'].map(key => [
document.querySelector(`#FTone${key}`),
new Audio(`../instrumentarium/assets/snd/flute/${key}_F.wav`),
]);
推荐阅读
- node.js - 我想使用 Pond.js 但不知道如何要求它
- matlab - Matlab中矩阵中每10个数字的平均值
- exe - 在用 launch4j 包装的 Firefox 上阻止 .exe 下载
- amazon-web-services - 如何在 AWS amplify-js 中处理刷新令牌服务
- reactjs - 使用 fetchAPI 和 Drupal 作为解耦后端的无效 X-CSRF-Token 请求标头
- python-3.x - 在 Windows 机器上保存 client_secret.json 的位置?
- dynamics-365 - 从 Dynamics 365 导出数据并将其发送到 FTP 服务
- ansible - Jinja2 Ansible 中的转义字符
- ionic-framework - 如何从本地存储中选择文件?离子文件选择器错误
- rxjs - rxjs 并订阅集合中的新值