You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在对象字面量的键中使用表达式?附switch转对象实现问题

问题分析与解决

你的问题出在对对象字面量键的使用逻辑错误,以及误解了原switch代码的匹配逻辑:

原写法的核心问题

  1. 你把s.includes('a')的布尔结果转成字符串(比如"true"/"false")作为对象键,但最后用变量s(比如"aaa")去访问对象,两者完全不匹配,自然拿不到对应URL。
  2. 对象的键是唯一的,如果多个条件同时为真(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 01:05:26