ES6 使用正则表达式过滤数组

新手上路,请多包涵

我正在尝试过滤包含一堆 url 的数组。我需要返回仅包含“联系人”一词的网址。

例如有一个链接 https://www.example.com/v1/contact-us/ca

这应该从过滤器返回。

我试过这个:

     const regex = new RegExp("/\bcontact\b", 'g' )
    sites.links.filter((val) => {

     console.log(regex.test(val.href))

    })

当我知道有一个域包含“联系人”一词时,它目前只是通过所有域发回假消息。

原文由 Dileet 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 763
2 个回答

首先 new RegExp('/\bcontact\b', 'g'); 相当于 /\/@contact@/g 其中 @ 是退格字符(ASCII 08)……显然不是什么08

所以,你会做 new RegExp('/\\bcontact\\b', 'g'); 这相当于 /\/\bcontact\b/g

但是, \\b 之后的 / 是多余的

所以…下降到 /\/contact\b/g

使用 string.match 这里作为 regex.test 被滥用。下面是说明

var sites = {
    links: [
        {href: 'https://www.example.com/v1/contact-us/ca'},
        {href: 'https://www.example.com/v1/contact-us/au'},
        {href: 'https://www.example.com/v1/contact-us/us'},
        {href: 'https://www.example.com/v1/dontcontact-us/us'}
    ]
};

const regex = new RegExp('/contact\\b', 'g');
const matchedSites = sites.links.filter(({href}) => href.match(regex));
console.log(matchedSites);

下一个问题是在带有 g 标志的 regexp.test 中多次使用 ONE 正则表达式。每次调用时,它将从下一个 indexOf 之前找到的子字符串开始查找,并在同一类型的字符串上连续调用,它基本上将返回 true , false , true , false

如果你想使用 regex.test ,那么不要重复使用相同的正则表达式,除非你知道这样做的后果或者不使用 g 标志(这里你不需要)

 var sites = {
    links: [
        {href: 'https://www.example.com/v1/contact-us/ca'},
        {href: 'https://www.example.com/v1/contact-us/au'},
        {href: 'https://www.example.com/v1/contact-us/us'},
        {href: 'https://www.example.com/v1/dontcontact-us/us'}
    ]
};

const regex = new RegExp('/contact\\b', 'g');
const correctRegex = new RegExp('/contact\\b');

const matchedSitesFailed = sites.links.filter(({href}) => regex.test(href));
const matchedSitesSuccess = sites.links.filter(({href}) => new RegExp('/contact\\b', 'g').test(href));
const matchedSitesSuccess2 = sites.links.filter(({href}) => correctRegex.test(href));

console.log('failed returns:', matchedSitesFailed.length);
console.log('success returns:', matchedSitesSuccess.length);
console.log('success returns 2:', matchedSitesSuccess2.length);

原文由 Jaromanda X 发布,翻译遵循 CC BY-SA 4.0 许可协议

您需要从 filter 函数返回真/假结果。

 const sites = {
  links: [
    {
      href: 'http://www.some-site.com/contact-us',
    },
    {
      href: 'http://www.some-site.com/about',
    },
    {
      href: 'http://www.some-site.com/admin',
    },
  ],
};

const fitered = sites.links.filter((link) => {
  return link.href.split('/').some((part) => part.includes('contact'));
});

console.log(fitered);

原文由 felixmosh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题