如何精简根据颜色值查找对应键名的TypeScript代码?
TypeScript多语言颜色值查找代码精简方案
你的核心问题是重复调用getKeyByValue函数,冗余代码过多。可以通过以下方式大幅精简:
优化思路
- 统一管理目标颜色:将所有需要查找的德语、英语颜色值整理到一个数组中,避免重复编写相同的查找逻辑
- 简化循环结构:用更简洁的循环语法替代传统for循环,同时减少嵌套的判断分支
- 性能优化(可选):提前构建值到键的映射表,把多次线性查找转为单次哈希查找,提升效率
精简代码示例
基础精简版(保持原有查找逻辑)
const getKeyByValue = (obj: _Variant, value: string) => Object.keys(obj).find(key => obj[key] === value.toLowerCase()); // 统一管理所有要查找的颜色(德语+英语) const targetColors = [ "schwarz", "black", "weiß", "white", "rot", "red", "gelb", "yellow", "grün", "green", "blau", "blue", "lila", "purple", "beige", "pink", "camouflage", "gold", "silber", "silver" ]; let k = null; // 遍历每个variant,逐个匹配颜色 for (const variant of variants) { // 遍历颜色数组,找到第一个匹配的键 k = targetColors.find(color => getKeyByValue(variant, color)); if (k) { // 找到匹配后立即跳出循环 break; } }
性能优化版(适合数据量较大的场景)
如果variants数量多或每个variant的键值对较多,建议提前构建值到键的映射,减少重复查找:
// 统一管理目标颜色并转成小写,避免重复转换 const targetColors = [ "schwarz", "black", "weiß", "white", "rot", "red", "gelb", "yellow", "grün", "green", "blau", "blue", "lila", "purple", "beige", "pink", "camouflage", "gold", "silber", "silver" ].map(color => color.toLowerCase()); let k = null; // 使用标签循环快速跳出多层循环 outerLoop: for (const variant of variants) { // 构建当前variant的“小写值→键”映射表 const valueToKeyMap = Object.fromEntries( Object.entries(variant).map(([key, value]) => [value.toLowerCase(), key]) ); // 遍历目标颜色,直接从映射表取结果 for (const color of targetColors) { if (valueToKeyMap[color]) { k = valueToKeyMap[color]; break outerLoop; } } }
优化说明
- 两种方案都彻底消除了重复的
getKeyByValue调用和if-break分支,代码结构更清晰 - 基础版保留了你原有的查找逻辑,改动最小
- 性能优化版通过哈希映射将每次查找的时间复杂度从O(n)降为O(1),在数据量大时优势明显
内容的提问来源于stack exchange,提问作者managerit017
相关产品推荐
相关产品推荐

