如何在对象字面量的键中使用表达式?附switch转对象实现问题
问题分析与解决
你的问题出在对对象字面量键的使用逻辑错误,以及误解了原switch代码的匹配逻辑:
原写法的核心问题
- 你把
s.includes('a')的布尔结果转成字符串(比如"true"/"false")作为对象键,但最后用变量s(比如"aaa")去访问对象,两者完全不匹配,自然拿不到对应URL。 - 对象的键是唯一的,如果多个条件同时为真(比如s同时包含a和b),后面的键会覆盖前面的,无法实现原switch的顺序优先匹配逻辑。
正确的替代实现(模拟switch顺序匹配)
如果你想用更简洁的方式替代switch,推荐用规则数组+遍历匹配,完全复刻原代码的行为:
let s = "aaa"; const getUrl = (str) => { // 按顺序定义条件与对应URL的规则 const rules = [ { check: () => str.includes('a'), url: 'https://a.com/wp-admin/post-new.php' }, { check: () => str.includes('b'), url: 'https://b.com/wp-admin/post-new.php' } ]; // 找到第一个满足条件的规则 const matchedRule = rules.find(rule => rule.check()); // 有匹配返回对应URL,否则执行default逻辑 if (matchedRule) { console.log(matchedRule.url); return matchedRule.url; } else { console.log('default'); return 'default'; } }; getUrl(s);
另一种Map实现(保留顺序)
如果偏好键值对结构,可以用Map(它会保留插入顺序,符合switch的顺序匹配逻辑):
let s = "aaa"; const getUrl = (str) => { const ruleMap = new Map([ [() => str.includes('a'), 'https://a.com/wp-admin/post-new.php'], [() => str.includes('b'), 'https://b.com/wp-admin/post-new.php'] ]); for (const [check, url] of ruleMap) { if (check()) { console.log(url); return url; } } console.log('default'); return 'default'; }; getUrl(s);
为什么原对象写法不行?
当s = "aaa"时,你定义的cases对象实际是:
{ "true": "https://a.com/wp-admin/post-new.php", "false": "https://b.com/wp-admin/post-new.php" }
你用cases[s]即cases["aaa"]访问,对象里根本没有这个键,所以返回undefined,这就是代码无法正常工作的原因。
内容的提问来源于stack exchange,提问作者Eli Tref
相关产品推荐
相关产品推荐

