JavaScript中如何根据指定BPM输入映射返回对应时间数值
BPM时长映射最优实现方案
直接用键值对映射表实现即可,完全替代冗余的if/else判断,维护成本最低、性能最好,适配你当前固定每次调整4BPM的逻辑。
具体实现步骤
- 先定义独立的BPM-时长映射配置,所有对应关系统一存在这里,后续改值直接改配置,不用碰业务逻辑
- 声明全局
timeChange变量存储实时的时长变化值 - 在原有增减BPM的逻辑末尾,直接通过查表更新
timeChange即可,顺手修复你原有decrease函数缺少花括号的逻辑bug(原写法下即使rate <= 0.25也会执行bpm -=4,不符合预期)
完整代码
// BPM与对应新增时长的映射配置,后续调整规则直接修改此处 const bpmTimeMap = { "-52": 4.75, "-48": 4.5, "-44": 3.8, "-40": 3.2, "-36": 2.5, "-32": 2, "-28": 2, "-24": 1.5, "-20": 1.25, "-16": 0.85, "-12": 0.75, "-8": 0.5, "-4": 0.25, "0": 0, "4": 0, "8": -0.2, "12": -0.4, "16": -0.6, "20": -0.6, "24": -0.8, "28": -0.9, "32": -1.1, "36": -1.1, "40": -1.2, "44": -1.35, "48": -1.42, "52": -1.55 }; let timeChange = 0; // 你需要的时长变化变量 function increase() { // 原有播放速度调整逻辑 rate += 0.03808; bpm += 4; // 同步匹配对应时长,超出映射范围默认兜底为0,可按需修改兜底值 timeChange = bpmTimeMap[bpm] ?? 0; } function decrease() { if (rate > .25) { rate -= 0.03808; bpm -= 4; // 同步匹配对应时长 timeChange = bpmTimeMap[bpm] ?? 0; } }
方案优势
- 性能最高:对象键值对查表时间复杂度为O(1),比多分支条件判断快很多
- 易维护:映射规则和业务逻辑完全分离,新增、修改、删除对应关系不需要调整逻辑代码
- 可读性强:所有映射值集中展示,不需要在冗长的if/else分支里翻找对应规则
如果后续你新增了微调BPM的功能(比如每次调整1BPM,步长不再固定为4),只需要在查表逻辑里加一层就近取最近4的倍数BPM值的逻辑即可,不需要重构整体结构。
内容的提问来源于stack exchange,提问作者Matt C
相关产品推荐
相关产品推荐

