
本文介绍一种安全、可扩展的 javascript 实现方式,通过对象字面量管理多个调色板数组,并在通用转换函数中按名称动态访问,避免传入字符串却误当数组使用的常见错误。
在将高精度 RGB-16(16 位每通道,取值范围 0–65535)颜色值降级为标准 RGB-8(8 位每通道,0–255)时,核心换算逻辑是:math.round(value / 257) —— 因为 65535 ÷ 255 = 257,该除法可精准映射整个 16 位范围到 8 位整数空间。
但原始代码存在一个关键类型错误:
convert('system41'); // 传入的是字符串 'system41' // 而函数内却执行: palette.foreach(...) // ❌ 字符串没有 forEach 方法!
这会导致 TypeError: palette.forEach is not a function。
✅ 正确做法是分离“数据”与“标识符”:将所有调色板统一存入一个对象,键为名称(如 ‘system41’),值为对应二维数组。函数接收字符串参数后,通过方括号属性访问(palettes[palette])获取真实数组:
const palettes = { system41: [ [65535, 65535, 65535], [64512, 62333, 1327], [65535, 25738, 652] ], system7: [ [65535, 65535, 52428], [65535, 52428, 39321], [52428, 39321, 26214] ] }; function convert(paletteName) { const targetPalette = palettes[paletteName]; if (!targetPalette) { console.warn(`调色板 "${paletteName}" 未定义`); return; } targetPalette.forEach((rgb16) => { const rgb8 = rgb16.map(v => Math.round(v / 257)); document.querySelector(`#${paletteName}`).innerhtml += rgb8.join(', ') + 'n'; }); } convert('system41'); convert('system7');
? 注意事项:
- 确保 HTML 中存在对应 ID 的容器,例如
和
;
- 添加存在性校验(if (!targetPalette))可提升健壮性,避免因拼写错误导致静默失败;
- 若需多次调用且不希望内容累加,建议先清空 innerHTML = ”,或使用 textContent 配合数组 join(‘n’) 批量渲染,更高效安全。
这种设计既保持函数单一职责(只做转换与渲染),又通过数据驱动实现灵活扩展——新增调色板只需向 palettes 对象添加新键值对,无需修改函数逻辑。