将相同的值分配给对象文字Reactjs中的不同键

时间:2019-02-18 20:43:06

标签: javascript reactjs

我使用对象文字代替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];}

有人可以帮我解决这个问题吗?谢谢。

3 个答案:

答案 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对象预计会变得很大,那么这实际上可能是适合您的解决方案。