本文介绍如何通过条件赋值链与字符串构建逻辑,高效替代冗长的 if-else 组合,动态生成符合规则的 j(含 >3 八度音符)和 k(含 ≤3 八度音符),自动添加括号、空格分隔及 /w 后缀。
本文介绍如何通过条件赋值链与字符串构建逻辑,高效替代冗长的 if-else 组合,动态生成符合规则的 `j`(含 >3 八度音符)和 `k`(含 ≤3 八度音符),自动添加括号、空格分隔及 `/w` 后缀。
在 JavaScript 中,面对多变量、多条件的分支组合(如本例中 bOct–eOct 四个变量各自独立判断是否 >3),硬编码 16 种 if/else if 路径不仅难以维护,也严重违背 DRY(Don’t Repeat Yourself)原则。理想解法是将条件逻辑解耦为可迭代、可映射的结构,用统一模式处理每个变量对,再聚合结果。
以下为优化后的核心逻辑(已整合进完整 fetch() 函数):
function fetch() {
const pc = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];
const text1 = document.getElementById("text1");
const text2 = document.getElementById("text2");
// 随机生成音名索引与八度值
const [bPc, cPc, dPc, ePc, fPc, gPc, hPc, iPc] =
Array(8).fill().map(() => Math.floor(Math.random() * pc.length));
const [bOct, cOct, dOct, eOct] =
Array(4).fill().map(() => Math.floor(Math.random() * 6));
// 构建音符字符串(如 "C4", "G#2")
const b = pc[bPc], c = pc[cPc], d = pc[dPc], e = pc[ePc];
const f = pc[fPc], g = pc[gPc], h = pc[hPc], i = pc[iPc];
let j = "", k = "";
// ✅ 动态构建 j:所有 >3 的 xOct 对应主音符 + 八度
j += (bOct > 3) ? b + bOct + " " : "";
j += (cOct > 3) ? c + cOct + " " : "";
j += (dOct > 3) ? d + dOct + " " : "";
j += (eOct > 3) ? e + eOct + " " : "";
// ✅ 动态构建 k:所有 ≤3 的 xOct 对应辅音符 + 八度(f/g/h/i 映射 b/c/d/e)
k += (bOct <= 3) ? f + bOct + " " : "";
k += (cOct <= 3) ? g + cOct + " " : "";
k += (dOct <= 3) ? h + dOct + " " : "";
k += (eOct <= 3) ? i + eOct + " " : "";
// ✅ 标准化格式:去首尾空格 → 加括号(仅当含空格)→ 添加 /w 后缀
const format = (str) => {
str = str.trim();
if (str === "") return "";
str = str.includes(" ") ? `(${str})` : str;
return `${str}/w`;
};
j = format(j);
k = format(k);
text1.innerHTML = j;
text2.innerHTML = k;
}关键优势说明:
- 可扩展性强:新增变量只需追加一行 j += ... 和 k += ...,无需修改分支结构;
- 语义清晰:每行对应一个变量的独立判断,逻辑无耦合;
- 格式健壮:format() 函数统一处理括号包裹、空格分隔与后缀拼接,避免手动 replace() 的边界风险(如 " )" 误匹配);
- 性能友好:仅遍历 4 次,时间复杂度 O(1),远优于 16 路 if 的最坏匹配开销。
注意事项:
- 原代码中 window.onload = fetch(); 是错误写法(立即执行而非绑定),应改为 window.onload = fetch;;
- 若未来需支持更多音符组(如 j/k 映射关系动态配置),建议将 [[b,bOct,f], [c,cOct,g], ...] 抽象为数组,配合 reduce() 或 forEach() 处理;
- Math.random() 生成的八度范围 [0,5] 与业务中“>3”逻辑一致,但若需求变更(如改为 ≥4),仅需调整比较符,不影响整体结构。
此方案以声明式条件拼接 + 函数式格式封装取代过程式分支爆炸,是处理多维布尔组合问题的典型范式升级。

















