【问题标题】:How to use regex as a mapping key for object如何使用正则表达式作为对象的映射键
【发布时间】:2021-06-11 12:36:07
【问题描述】:

我正在尝试使用键映射对象,以便可以轻松地返回它们。 我可以得到一个字符串或正则表达式,这是问题所在,将密钥设置为字符串很容易。

这是我在路由为字符串时为对象设置键的方式,但问题是我无法将正则表达式设置为键,它需要是数字或字符串。

private nodesByRoute: { [key: string]: NavbarItemNode } = {};

this.nodesByRoute[node.route] = node;

所以我想解决方案看起来像这样:

private nodesByRoute: { [key: string | RegExp]: NavbarItemNode } = {};

我的实现是我得到一个路由字符串,比方说 /category/items ,如果它匹配它将返回这样的节点:

return this.nodesByRoute[routerLink];

但我也需要它来使用正则表达式,因为我可以得到这样的东西:/items/60。 所以我得到了items/ 和项目的编号,这就是我需要正则表达式作为键的原因。

此外,我认为在尝试将键与我的路线匹配时,我还需要逻辑。 路线将始终是一个字符串,但键可能是正则表达式,所以我认为这不会起作用:

return this.nodesByRoute[routerLink];

【问题讨论】:

标签: angular regex typescript mapping


【解决方案1】:

不确定你想要什么。

但是如果你想用字符串和数字以外的东西作为键,你可以试试Map

const nodesByRoute: Map<RegExp, NavbarItemNode> = new Map<RegExp, NavbarItemNode>();

但是,有一个警告。如果你使用文字 RegExp 来获取值,它将不起作用。

const m = new Map<RegExp, string>();
m.set(/ab.*/, "Hello World");
console.log(m.get(/ab.*/)); // undefined

因为不同的文字 RegExp 将被视为不同的 RegExp 实例,使用非原始对象作为 Map 的键意味着使用对象的引用作为键。所以下面的代码就可以了。

const m = new Map<RegExp, string>();
const regexKey: RegExp = /ab.*/;
m.set(regexKey, "Hello World");
console.log(m.get(regexKey)); // "Hello World"

当您尝试这样做时,也意味着您需要管理所有这些RegExp 密钥。这可能不是您想要花时间去做的事情。

我认为你真正想要的事情是这样的:

const m = new Map<RegExp, string>();
m.set(/ab.*/, "Hello World");
console.log(m.get('abc')); // undefined

同样,字符串'abc' 不会自动匹配RegExp 键。这就是你需要做一些工作的部分。

在我看来,您可以尝试创建一个实现不同路由模式检查逻辑的方法,然后通过轻松调用该方法返回您想要的值,如下所示:

let node = this.nodesByRoute(routerLink);

【讨论】:

  • 谢谢,是的,我的计划是让它像你给出的最后一个解决方案一样工作,所以我想在返回值时我需要稍微玩一下逻辑。
猜你喜欢
  • 2017-02-26
  • 1970-01-01
  • 2018-12-02
  • 2023-02-01
  • 2017-10-31
  • 2016-09-08
  • 1970-01-01
  • 2020-07-15
  • 2016-06-26
相关资源
最近更新 更多