我使用对象文字代替if else / switch语句。这样一来,不知道如何为不同的键分配相同的值。
我要做什么? 基于名为“用户”的变量应重定向到不同的链接。 如果“用户”的值为管理员或管理员,则应重定向为“ www.exampledomain.com”。如果“用户”的值为“购买者”,则应重定向到“ https://stackoverflow.com”。
为此,我使用了对象字面量,而不是if-else,这很笨拙。 下面是代码,
get user() {
return ( {
'admin': 'www.exampledomain.com',
'manager': 'www.exampledomain.com',
'purchaser': 'https://stackoverflow.com',
} )[user];}
从上面的代码中可以看到,管理键和管理键指向相同的网址“ www.exampledomain.com”。有没有办法分配它,如下所示。
get user() {
return ( {
'admin': 'manager': www.exampledomain.com',
'purchaser': 'https://stackoverflow.com',
} )[user];}
有人可以帮我解决这个问题吗?谢谢。
答案 0 :(得分:1)
就我个人而言,我看不出有任何理由使用第二个想法,而且它不是有效的JS代码。
如果您要减少代码重复,则可以将urls
提取到这样的常量中。
static get REDIRECT_URLS() {
return {
"PRIMARY_SITE" : "www.exampledomain.com",
"SECONDARY_SITE" : "stackoverflow.com",
};
}
get user() {
return ( {
'manager' : FooClass.REDIRECT_URLS.PRIMARY_SITE,
'admin': FooClass.REDIRECT_URLS.PRIMARY_SITE,
'purchaser': FooClass.REDIRECT_URLS.SECONDARY_SITE,
} )[user];}
当然还有其他可能的解决方案,例如拥有像'admin|manager' : "url"
这样的键,但这似乎不是一个好选择,您需要添加额外的逻辑来遍历对象键并检查键是否匹配正则表达式。
答案 1 :(得分:1)
您可以这样设置默认路由:
function user() {
const defaultRoute = "www.exampledomain.com"
return ({
'admin': defaultRoute,
'manager': defaultRoute,
'purchaser': 'https://stackoverflow.com'
})[user];
}
或那个
function user2() {
const defaultRoute = "www.exampledomain.com"
return ({
'someoneElse': "www.google.com",
'purchaser': 'https://stackoverflow.com'
})[user] || defaultRoute;
}
或混合两种样式,具体取决于语句的复杂程度;
或者甚至是从另一侧制作
function user3(user) {
const routes = {
"www.google.com": ["admin", "manager"],
"www.exampledomain.com": ["purchaser"]
};
return Object.keys(routes).find(k => routes[k].includes(user));
}
console.log(user3('manager')); //www.google.com
答案 2 :(得分:1)
如果要孤立地查看问题,我将通过简单地翻转数据结构来解决此问题
const linkToTypeMapping = {
'www.exampledomain.com': ['admin', 'manager'],
'https://stackoverflow.com': ['purchaser'],
}
但这并不能真正解决您的问题。
我要解决实际用例的方法是简单地向用户对象添加link
属性,然后填充并稍后访问userObject.link
。
但是,为了完整性起见,这是从我上面发布的数据结构中提取用户链接的方法。
const get_link = (type) => {
for (let key in linkToTypeMapping) {
if(linkToTypeMapping.includes(type)) {
return key;
}
}
}
就代码而言,这显然非常复杂,但是如果您的linkToTypeMapping
对象预计会变得很大,那么这实际上可能是适合您的解决方案。