Javascript 将相同的值指定给对象中的不同键
我使用对象文字作为if-else/switch语句的替代。这样做时,不知道如何将相同的值分配给不同的键 我想做什么? 基于名为“user”的变量,应重定向到不同的链接。 若“user”的值为admin或manager,则应重定向至“www.exampledomain.com”。如果“用户”的值为“买方”,则应重定向到“” 为此,我使用了objectliteral,而不是if-else,这很笨拙。 下面是代码Javascript 将相同的值指定给对象中的不同键,javascript,reactjs,Javascript,Reactjs,我使用对象文字作为if-else/switch语句的替代。这样做时,不知道如何将相同的值分配给不同的键 我想做什么? 基于名为“user”的变量,应重定向到不同的链接。 若“user”的值为admin或manager,则应重定向至“www.exampledomain.com”。如果“用户”的值为“买方”,则应重定向到“” 为此,我使用了objectliteral,而不是if-else,这很笨拙。 下面是代码 get user() { return ( { 'admin'
get user() {
return ( {
'admin': 'www.exampledomain.com',
'manager': 'www.exampledomain.com',
'purchaser': 'https://stackoverflow.com',
} )[user];}
从上面的代码中可以看到,admin和manager键指向同一url“www.exampledomain.com”。有没有一种方法可以指定如下内容
get user() {
return ( {
'admin': 'manager': www.exampledomain.com',
'purchaser': 'https://stackoverflow.com',
} )[user];}
谁能帮我解决这个问题。谢谢。就我个人而言,我不认为有任何理由使用第二种想法,而且它不是有效的JS代码。 如果您试图减少代码重复,您只需将
url
提取到一个常量变量中即可
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”,但这似乎不是一个好选择,您需要添加额外的逻辑来迭代对象键并检查键是否与正则表达式匹配。您可以这样设置默认路由:
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
如果孤立地看待这个问题,我将通过简单地翻转数据结构来解决这个问题
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
对象预计会变得相当大,那么这实际上可能是适合您的解决方案。@ManavM正如我所指出的,应该有额外的逻辑来匹配对象键,这没有任何意义——基本上只是某种方法,在这种方法中,您可以迭代这个对象,并有一些逻辑来从中提取必要的数据?我想这也行得通……我试着做了一个类似于下面答案中的实现,但感觉不干净。@ManavM它可以用不同的方式实现,例如使用闭包捕获具有常量值的上下文,以及迭代对象键的逻辑。然而,我强烈建议不要这样做。你的答案是另一种方式,你有倒置的属性,但在这种情况下,它违反了一些可读性概念,这可以理解为“为url分配用户角色”,我同意。好吧,谢谢你花时间进一步解释你的答案。@ManavM,不客气,你正在尝试找到更好的解决方案,这真是太好了!