使用reduce检查数组中是否包含与字符串匹配的正则表达式

3

我有一个JavaScript正则表达式列表,像下面这样:

var list = [
 '^/items/detail.*',
 '^/items/settings.*',
 '^/article/view/.*',
 '^/home/purchase.*',
];

我希望查看字符串是否与数组中的某个正则表达式匹配。 如果可能的话,我想使用reduce函数。 我尝试过以下方法:
var text = "http://www.mypage.com/items/detail";
var result = list.reduce((a, b) =>
  !!text.match(a) || !!text.match(b)
);

但似乎没有起作用。出于某种原因它返回false。我尝试了不同的变化,但都无法找到一个有效的方法。

你觉得用 some 代替 reduce 怎么样?你需要知道正则表达式匹配了什么,还是至少有一个匹配吗? - Andy
1
正如安迪所提到的,对于这种情况似乎更适合使用 somevar result = list.some(t=> text.match(t)); ,但您需要修改正则表达式并删除“startswith” ^,否则表达式将无法匹配。(http://jsfiddle.net/28rzph21/ ) - Me.Name
1个回答

9
你需要使用 RegExp() 并添加一个额外的条件 a === true,因为在第二次迭代中,a 的值将会是 true 或 false。

var list = [
  '/items/detail.*',
  '^/items/settings.*',
  '^/article/view/.*',
  '^/home/purchase.*',
];

var text = "http://www.mypage.com/items/detail";
var result = list.reduce((a, b) =>
  a === true || (a !== false && !!text.match(RegExp(a))) || !!text.match(RegExp(b))
);

console.log(result)


更新:

根据@zerkms的建议,提供了一个附加的initialValue作为false的更简化版本。

var list = [
  '/items/detail.*',
  '^/items/settings.*',
  '^/article/view/.*',
  '^/home/purchase.*',
];

var text = "http://www.mypage.com/items/detail";
var result = list.reduce((a, b) => a || RegExp(b).test(text), false)

console.log(result)


为了避免丑陋的 typeof a == 'string',可以将 false 作为初始值传递。 - zerkms
在第一次迭代中,!!text.match(a) || !!text.match(b) 将返回 truefalse,因此在第二次迭代中,a 的值将是布尔类型。 - Pranav C Balan
当然,正是为了这个原因,你要显式地用 false 进行初始化,以便累加器始终是布尔类型。 - zerkms
4
list.reduce((a, b) => a || RegExp(b).test(text), false) - zerkms
1
@zerkms:我一开始很困惑,现在我明白了...谢谢 :) - Pranav C Balan
2
谢谢更新!这是我发现的另一种方法(但没有使用reduce :( ) list.filter((a) => path.match(a)).length > 0 - user2773755

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接