Фильтрация массива списка пользователей, содержащая тег с помощью RegExp в javascript - PullRequest
0 голосов
/ 25 октября 2018

Фильтрация списка пользователей по тегу.У меня есть массив списка пользователей, и я хочу фильтровать по тегам, используя массив filter match, а RegExp для сопоставления содержит текст своей работы, но не получает ожидаемого результата.

    let users=[{id:1,name:'john',tags:'a,b,c,v'},{id:2,name:'die',tags:'a,b,w,x'},{id:3,name:'ren',tags:'c,p,q,n'}];
    let tagString='a,b,c';
    let tagStringQuery = new RegExp(tagString, "i");

    let data=users.filter((user) => user.tags.match(tagStringQuery)).map((user)=> user);
    console.log('data',data);

    O/P = [{id:1,name:'john',tags:'a,b,c,v'}]

    but expected result is all user list which contains an 'a' or 'b' or 'c' tag.

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

tagstring должно быть 'a|b|c' вместо 'a,b,c', если вы хотите применить оператор or к этим тегам

0 голосов
/ 25 октября 2018

Примерно так должно работать без регулярных выражений

let data = users.filter(x=>
  tagString
  .split(",")
  .some(r=>
    x.tags.split(",").includes(r)));
0 голосов
/ 25 октября 2018

Это действительно не работа для регулярного выражения.В идеале вы должны иметь теги в качестве Set экземпляров, используя пересечение с запросом Set для проверки наличия тегов.

Если вы настаиваете на регулярном выражении, вы не можете напрямую искать a,b,c длянайдите, присутствует ли какой-либо из a, b или c: вам нужно будет найти a|b|c (то есть tagString.split(',').join('|')).Если теги состоят из более чем одной буквы, вам нужно беспокоиться о подстроках, поэтому строка поиска должна быть \b(a|b|c)\b, а вам нужно regexp-escape всех строк.И если у вас есть многословные теги или странные символы в них, вам нужно будет найти ,(a|b|c), внутри "," + user.tags + ",".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...