如何使用Object Literals优化含URL判断的Switch语句?
用对象字面量简化URL匹配逻辑
首先得明确:你原来的switch语句逻辑是错误的——switch (url as any)搭配case url.includes('trips')这种写法,本质是把完整URL和布尔值(includes返回true/false)做严格相等比较,几乎不可能匹配成功,实际所有情况都会走default,根本没实现你想要的判断逻辑。
接下来解决你的核心需求:用对象字面量简化匹配逻辑,关键是遍历对象的键,检查URL是否包含该键,而不是直接用URL当键。这里有两种靠谱的实现方式:
方式一:对象+遍历(明确匹配顺序)
export const getTravelInfo = () => { const url = window.location.href; const travelMap = { // 注意:把更具体的URL片段放在前面,避免被宽泛的片段提前匹配 'sailing-trips': sailingTrips, 'mini-trips': miniTrips, 'trips': epicTrips }; // 遍历对象的键,逐个检查URL是否包含该片段 for (const key of Object.keys(travelMap)) { if (url.includes(key)) { return travelMap[key]; } } // 没有匹配到任何片段时返回默认值 return epicTrips; };
方式二:数组维护匹配规则(更灵活)
如果需要频繁调整匹配顺序,用数组会更直观,不用依赖对象键的遍历顺序:
export const getTravelInfo = () => { const url = window.location.href; // 数组元素按「从具体到宽泛」的顺序排序 const travelRules = [ { fragment: 'sailing-trips', info: sailingTrips }, { fragment: 'mini-trips', info: miniTrips }, { fragment: 'trips', info: epicTrips } ]; // 找到第一个匹配的规则 const matchedRule = travelRules.find(rule => url.includes(rule.fragment)); // 有匹配返回对应信息,否则返回默认值 return matchedRule ? matchedRule.info : epicTrips; };
为什么你的getTravelInfo2不生效?
你写的return travel[url]是试图用完整URL作为对象的键,但对象里的键是trips这类短字符串,两者完全不匹配,自然拿不到对应值。必须通过遍历检查每个键是否存在于URL中,才能实现你想要的逻辑。
内容的提问来源于stack exchange,提问作者ashley g
相关产品推荐
相关产品推荐

